javaSE集合框架(二)—— Map接口

发布时间:2026/7/22 1:32:22
javaSE集合框架(二)—— Map接口 目录一、Map接口及5个主要实现类1.1 5个主要实现类的对比1.2 key-value 结构的理解二、HashMap2.1 HashMap源码中的重要常量2.2 HashMap在JDK 7的底层实现原理(数组+链表)2.3HashMap在JDK 7的底层源码分析1)new HashMap()源码分析2)添加元素put()源码分析3)扩容2.4HashMap在JDK 8的底层实现原理2.5 HashMap在JDK 8的底层源码分析1)new HashMap()源码分析2)put()添加元素源码分析三、LinkedHashMap3.1 LinkedHashMap的特点3.2 源码分析四、TreeMap五、Properties实现类六、HashSet和HashMap底层实现之间的联系七、Map接口的常用方法7.1 添加、修改、删除、size、isEmpty7.2 元素查询的相关方法7.3 遍历7.4 Map常用方法总结一、Map接口及5个主要实现类1.1 5个主要实现类的对比|--------Map: 双列数据,存储key-value对的数据(类似于高中的函数) |------HashMap:作为Map的主要实现类 ; 线程不安全,效率高;可以存储值为null的key和值为null的value;JDK 7 底层使用数组+链表,JDK 8 使用数组+链表OR红黑树(为了提升效率) |---------LinkedHashMap:在HashMap底层结构的基础上加上了双向链表,可以按照添加的顺序实现遍历。对于频繁的遍历操作,LinkedHashMap的效率高于HashMap。 |-------TreeMap:按照key排序(自然排序或定制排序);底层是用红黑树; |--------Hashtable: 作为古老的实现类(淘汰);线程安全,效率低;key和value都不能为null。 |--------Properties:常用来处理配置文件;key和value都是String类PS:① Hashtable和HashMap的关系类似于Vector和ArrayList的关系 ② 和Vector一样,当我们涉及到线程安全时,也不选择用Hashtable,而是将HashMap扔给Collections工具类,返回一个线程安全的对象。1.2 key-value 结构的理解先一列一列地看,key是无序不可重复的,可理解为用Set存储=====key所在的类要重写equals()和hashcode()方法(以HashSet为例,TreeSet不一样)values是无序可重复的,可理解为用Collection存储(既不满足List也不满足Set)====values所在的类要重写equals()方法再一行一行地看,每一行的“key-value”键值对组成一个Entity实体,这个实体是无序不可重复的,整个实体(key,value)作为一个Set的元素。简单理解,就看这个y=x^2的函数就行。二、HashMap2.1 HashMap源码中的重要常量2.2 HashMap在JDK 7的底层实现原理(数组+链表)HashMap map = new HashMap();底层创建一个长度是16、类型为Entry的一维数组Entry[] table。map.put(key1,value1); 首先计算key1的哈希值,然后再用这个hash值通过类似于取余数的方式去计算散列地址/数组下标i。 |---------如果i这个位置上没有人,直接放进去。 |---------如果i位置上有人了,遍历整个“桶”,挨个比较hash值是否相同(假设是key2,value2) |----------如果哈希值不同,比较下一个 |----------如果哈希值相同,再调用key1.equals(key2)方法, |------------如果equals返回false,成功添加一个新元素 |------------如果equals返回true,用value1替换value2(HashMap的添加操作还具有修改的作用)|----------如果遍历完整个“桶”都没找到满足条件的,说明这个元素是新元素,成功添加一个新元素PS:当位置上有人时,往链表上追加的操作和HashSet相同,遵循“七上八下”map.put(key2,value2); map.put(key3,value3); ......一直put到数量不够时,扩容:if(size=threshold 数组的要存放的这个位置上不空),Entity[] table扩容为原来的2倍,并将原来的数据拷贝过来。注意这里不是简单的“下标一对一地粘贴过来”,而是重新计算以前所有元素的散列地址,that is to say拷贝前在同一条链上的元素拷贝后可能不在一起了。2.3HashMap在JDK 7的底层源码分析