目录
前言
HashMap的put()
1.Java7集合框架
1.1深入Java集合1:HashMap的实现原理
1. HashMap 概述:
2. HashMap 的数据结构:
3. HashMap 的存取实现:
深入Java集合2:HashSet的实现原理
1.HashSet 概述
2. HashSet 的实现
3. 相关说明
深入Java集合3:ArrayList实现原理
1. ArrayList 概述
2. ArrayList 的实现
深入Java集合4:LinkedHashMap的实现原理
1. LinkedHashMap 概述
2. LinkedHashMap 的实现
深入Java集合5:LinkedHashSet的实现原理
1. LinkedHashSet 概述
Java8集合框架
深入java8的集合1:ArrayList的实现原理
深入java8的集合2:LinkedList的实现原理
深入 java8 的集合 3:HashMap 的实现原理
深入 java8 的集合 4:LinkedHashMap 的实现原理
深入 java8 的集合 5:Hashtable 的实现原理
深入分析 HashMap
前言
HashMap的put()
1.Java7集合框架
1.1深入Java集合1:HashMap的实现原理
1. HashMap 概述:
HashMap 是基于哈希表的 Map 接口的非同步实现。此实现提供所有可选的映射操作, 并允许使用 null 值和 null 键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
2. HashMap 的数据结构:
3. HashMap 的存取实现:
从上面的例子中可以看出:当它们和 15-1(1110)“与”的时候,产生了相同的结果, 也就是说它们会定位到数组中的同一个位置上去,这就产生了碰撞,8 和 9 会被放到数组中的 同一个位置上形成链表,那么查询的时候就需要遍历这个链 表,得到 8 或者 9,这样就降低 了查询的效率。同时,我们也可以发现,当数组长度为 15 的时候,hash 值会与 15-1 (1110)进行“与”,那么 最后一位永远是 0,而 0001,0011,0101,1001,1011,0111, 1101 这几个位置永远都不能存放元素了,空间浪费相当大,更糟的是这种情况中,数组可以 使用的位置比数组长度小了很多,这意味着进一步增加了碰撞的几率,减慢了查询的效率! 而当 数组长度为 16 时,即为 2 的 n 次方时,2 n -1 得到的二进制数的每个位上的值都为 1, 这 使得在低位上&时,得到的和原hash 的低位相同,加之hash(int h)方法对key 的hashCode 的 进一步优化,加入了高位计算,就使得只有相同的hash 值的两个值才会被放到数组中的同一个位置上形成链表。所以说,当数组长度为 2 的 n 次幂的时候,不同的 key 算得得 index 相同的几率较小,那么数据在数组上分布就比较均匀,也就是说碰撞的几率小,相对的, 查询的时候就不用遍历某个位置上的链表,这样查询效率也就较高了。 根据上面 put 方法的源代码可以看出,当程序试图将一个 key-value 对放入 HashMap 中时,程序首先根据该 key 的 hashCode() 返回值决定该 Entry 的存储位置:如果两 个 Entry 的 key 的 hashCode() 返回值相同,那它们的存储位置相同。如果这两 个 Entry 的 key 通过 equals 比较返回 true,新添加 Entry 的 value 将覆盖集合中原 有 Entry 的 value,但 key 不会覆盖。如果这两个 Entry 的 key 通过 equals 比较返 回 false,新添加的 Entry 将与集合中原有 Entry 形成 Entry 链,而且新添加的 Entry 位 于 Entry 链的头部——具体说明继续看 addEntry() 方法的说明。
归纳起来简单地说,HashMap 在底层将 key-value 当成一个整体进行处理,这个整体 就是一个 Entry 对象。HashMap 底层采用一个 Entry[] 数组来保存所有的 key-value 对, 当需要存储一个 Entry 对象时,会根据 hash 算法来决定其在数组中的存储位置,在根据 equals 方法决定其在该数组位置上的链表中的存储位置;当需要取出一个 Entry 时,也会根据 hash 算法找到其在数组中的存储位置,再根据equals 方法从该位置上的链表中取出 该 Entry。
深入Java集合2:HashSet的实现原理
1.HashSet 概述
HashSet 实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的 迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
2. HashSet 的实现
3. 相关说明
1) 相关 HashMap 的实现原理,请参考我的上一遍总结:深入 Java 集合学习系列: HashMap 的实现原理。
2) 对于 HashSet 中保存的对象,请注意正确重写其 equals 和 hashCode 方法,以保证 放入的对象的唯一性
深入Java集合3:ArrayList实现原理
1. ArrayList 概述
2. ArrayList 的实现
深入Java集合4:LinkedHashMap的实现原理
1. LinkedHashMap 概述
LinkedHashMap 是 Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实 现提供所有可选的映射操作,并允许使用 null 值和 null 键。此类不保证映射的顺序,特别是 它不保证该顺序恒久不变。
LinkedHashMap 实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的 双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。 注意,此实现不是同步的。如果多个线程同时访问链接的哈希映射,而其中至少一个线程 从结构上修改了该映射,则它必须保持外部同步。
2. LinkedHashMap 的实现
深入Java集合5:LinkedHashSet的实现原理
1. LinkedHashSet 概述
LinkedHashSet 是具有可预知迭代顺序的Set 接口的哈希表和链接列表实现。此实现与 HashSet 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。
此链接列表 定义了迭代顺序,该迭代顺序可为插入顺序或是访问顺序。 注意,此实现不是同步的。如果多个线程同时访问链接的哈希Set,而其中至少一个线程 修改了该Set,则它必须保持外部同步。
Java8集合框架
深入java8的集合1:ArrayList的实现原理
深入java8的集合2:LinkedList的实现原理
深入 java8 的集合 3:HashMap 的实现原理
深入 java8 的集合 4:LinkedHashMap 的实现原理
深入 java8 的集合 5:Hashtable 的实现原理
深入分析 HashMap
参考链接:
(1)红黑树的性质:
(2)JDK1.8 HashMap 性能的提升:
文件:JDK7u7_src.zip