zoukankan      html  css  js  c++  java
  • Java集合框架Map接口

    集合框架Map接口

    Map接口:

    1. 键值对存储一组对象
    2. key不能重复(唯一),value可以重复
    3. 常用具体实现类:HashMap、LinkedHashMap、TreeMap、Hashtable

    HashMap

    HashMap实现原理:

    1. 基于哈希表(数组+链表+二叉树(红黑树JDK1.8新增的))
    2. 默认负载因子为0.75,默认的数组大小为16
    3. 如何把对象存储到哈希表中?
      把key对象通过hash()方法计算hash值,然后用这个hash值对数组长度(默认16)取余,来决定key对象在数组中的存储位置,当这个位置有多个对象时,以链表长度大于8时,链表将转换为红黑色结构存储。这样做的目的是为了取值更快,而且存储的数据量越大,效果越明显。
    4. 扩充原理:当数组的容量超过了75%时,那么表示该数组需要扩充,如何扩充呢?
      扩充的算法是:当前数组容量<<1(相当于乘2),扩大一倍。扩充次数越多,会影响性能,每次扩充表示哈希表重新散列(重新计算每个对象的存储位置),在开发中尽量减少扩充次数带来的性能问题
    5. 线程不安全,适合单线程使用

    代码示例:

    private static void hashMap() {
    	Map<Integer, String> map = new HashMap<>();
    	map.put(1, "One");
    	map.put(2, "Two");
    	map.put(3, "Three");
    
    	// map的遍历方式一(通过遍历Entry遍历键值)
    	Set<Entry<Integer, String>> entrySet = map.entrySet();
    	for (Entry<Integer, String> e : entrySet) {
    		System.out.println(e.getKey() + "->" + e.getValue());
    	}
    
    	// map的遍历方式二(通过遍历键取值)
    	Set<Integer> keys = map.keySet();
    	for (Integer i : keys) {
    		String value = map.get(i);
    		System.out.println(i + "->" + value);
    	}
    
    	// 只遍历值
    	Collection<String> values = map.values();
    	for (String v : values) {
    		System.out.println(v);
    	}
    
    	// forEach遍历,(遍历键值)
    	map.forEach((key, value) -> System.out.println(key + "->" + value));
    }
    

    TreeMap

    /**
     * 基于二叉树的红黑树实现
     */
    private static void treeMap() {
    	Map<Integer, String> map = new TreeMap<>();
    	map.put(1, "One");
    	map.put(2, "Two");
    	map.put(3, "Three");
    
    	map.forEach((key, value) -> System.out.println(key + "->" + value));
    }
    

    LinkedHashMap

    /**
     * LinkedHashMap:具有可预知的迭代顺序。此实现与HashMap的不同之处在于,它维护着一个运行于所有条目的双重链接列表。
     */
    private static void linkedHashMap() {
    	Map<Integer, String> map = new LinkedHashMap<>();
    	map.put(1, "One");
    	map.put(2, "Two");
    	map.put(3, "Three");
    
    	map.forEach((key, value) -> System.out.println(key + "->" + value));
    }
    

    Hashtable

    /**
     * JDK1.0开始就有
     * 基于哈希表实现(数组+链表)
     * 默认数组大小为11,负载因子为0.75f
     * 扩充方式:原数组<<1(乘2) + 1
     * 线程安全,用在多线程访问时
     */
    private static void hashtable() {
    	Map<Integer, String> table = new Hashtable<>();
    	table.put(1, "One");
    	table.put(2, "Two");
    	table.put(3, "Three");
    
    	table.forEach((key, value) -> System.out.println(key + "->" + value));
    }
  • 相关阅读:
    SQL 查询两个时间段是否有交集的情况 三种写法
    c# 时间区间求并集
    uniapp 身份证识别 微信 百度 图片前端压缩 图片后端压缩
    Git命令大全
    构建android studio项目
    如何查tomcat进程和杀死进程
    mysql 备份 还原不了
    解决git extensions每次要输入用户名和密码
    JS string 转 Byte64[]
    Git cmd
  • 原文地址:https://www.cnblogs.com/zxfei/p/10907581.html
Copyright © 2011-2022 走看看