目录

前言

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()

java 集合处理千万级数据_java

1.Java7集合框架

1.1深入Java集合1:HashMap的实现原理

1. HashMap 概述:

HashMap 是基于哈希表的 Map 接口的非同步实现。此实现提供所有可选的映射操作, 并允许使用 null 值和 null 键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

2. HashMap 的数据结构:

java 集合处理千万级数据_Java_02

 

java 集合处理千万级数据_java 集合处理千万级数据_03

 3. HashMap 的存取实现:

java 集合处理千万级数据_java 集合处理千万级数据_04

java 集合处理千万级数据_开发语言_05

 

java 集合处理千万级数据_实现原理_06

 

java 集合处理千万级数据_实现原理_07

 从上面的例子中可以看出:当它们和 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() 方法的说明。

 

java 集合处理千万级数据_java 集合处理千万级数据_08

 归纳起来简单地说,HashMap 在底层将 key-value 当成一个整体进行处理,这个整体 就是一个 Entry 对象。HashMap 底层采用一个 Entry[] 数组来保存所有的 key-value 对, 当需要存储一个 Entry 对象时,会根据 hash 算法来决定其在数组中的存储位置,在根据 equals 方法决定其在该数组位置上的链表中的存储位置;当需要取出一个 Entry 时,也会根据 hash 算法找到其在数组中的存储位置,再根据equals 方法从该位置上的链表中取出 该 Entry。

java 集合处理千万级数据_实现原理_09

 

java 集合处理千万级数据_实现原理_10

 

java 集合处理千万级数据_java_11

 

java 集合处理千万级数据_开发语言_12

 

java 集合处理千万级数据_java 集合处理千万级数据_13

 深入Java集合2:HashSet的实现原理

1.HashSet 概述

HashSet 实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的 迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。

2. HashSet 的实现

java 集合处理千万级数据_java 集合处理千万级数据_14

java 集合处理千万级数据_开发语言_15

 

java 集合处理千万级数据_java 集合处理千万级数据_16

 

java 集合处理千万级数据_java_17

 

java 集合处理千万级数据_java 集合处理千万级数据_18

 3. 相关说明

1) 相关 HashMap 的实现原理,请参考我的上一遍总结:深入 Java 集合学习系列: HashMap 的实现原理。

2) 对于 HashSet 中保存的对象,请注意正确重写其 equals 和 hashCode 方法,以保证 放入的对象的唯一性

 深入Java集合3:ArrayList实现原理

1. ArrayList 概述

java 集合处理千万级数据_实现原理_19

 2. ArrayList 的实现

java 集合处理千万级数据_Java_20

java 集合处理千万级数据_java_21

 

java 集合处理千万级数据_开发语言_22

 

java 集合处理千万级数据_开发语言_23

 

java 集合处理千万级数据_实现原理_24

 

java 集合处理千万级数据_java 集合处理千万级数据_25

 

java 集合处理千万级数据_Java_26

 

java 集合处理千万级数据_实现原理_27

 

java 集合处理千万级数据_java_28

 深入Java集合4:LinkedHashMap的实现原理

1. LinkedHashMap 概述

LinkedHashMap 是 Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实 现提供所有可选的映射操作,并允许使用 null 值和 null 键。此类不保证映射的顺序,特别是 它不保证该顺序恒久不变。

LinkedHashMap 实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的 双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。 注意,此实现不是同步的。如果多个线程同时访问链接的哈希映射,而其中至少一个线程 从结构上修改了该映射,则它必须保持外部同步。

2. LinkedHashMap 的实现

java 集合处理千万级数据_实现原理_29

 

java 集合处理千万级数据_java_30

 

java 集合处理千万级数据_Java_31

 

java 集合处理千万级数据_java 集合处理千万级数据_32

 

java 集合处理千万级数据_java 集合处理千万级数据_33

 

java 集合处理千万级数据_java_34

 

java 集合处理千万级数据_java_35

 深入Java集合5:LinkedHashSet的实现原理

1. LinkedHashSet 概述

LinkedHashSet 是具有可预知迭代顺序的Set 接口的哈希表和链接列表实现。此实现与 HashSet 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。

此链接列表 定义了迭代顺序,该迭代顺序可为插入顺序或是访问顺序。 注意,此实现不是同步的。如果多个线程同时访问链接的哈希Set,而其中至少一个线程 修改了该Set,则它必须保持外部同步。

java 集合处理千万级数据_开发语言_36

 

java 集合处理千万级数据_java 集合处理千万级数据_37

 

java 集合处理千万级数据_实现原理_38

 

java 集合处理千万级数据_java_39

 Java8集合框架

深入java8的集合1:ArrayList的实现原理

java 集合处理千万级数据_开发语言_40

 

java 集合处理千万级数据_开发语言_41

 

java 集合处理千万级数据_实现原理_42

 

java 集合处理千万级数据_实现原理_43

 

java 集合处理千万级数据_实现原理_44

 

java 集合处理千万级数据_Java_45

 

java 集合处理千万级数据_开发语言_46

 

java 集合处理千万级数据_java_47

 

java 集合处理千万级数据_实现原理_48

 

java 集合处理千万级数据_开发语言_49

 深入java8的集合2:LinkedList的实现原理

java 集合处理千万级数据_java 集合处理千万级数据_50

 

java 集合处理千万级数据_java 集合处理千万级数据_51

java 集合处理千万级数据_开发语言_52

 

java 集合处理千万级数据_java_53

 

java 集合处理千万级数据_java_54

 

java 集合处理千万级数据_实现原理_55

 

java 集合处理千万级数据_java_56

 

java 集合处理千万级数据_Java_57

 

java 集合处理千万级数据_实现原理_58

 

java 集合处理千万级数据_java_59

 

java 集合处理千万级数据_java 集合处理千万级数据_60

 

java 集合处理千万级数据_实现原理_61

 

java 集合处理千万级数据_java 集合处理千万级数据_62

java 集合处理千万级数据_实现原理_63

 

java 集合处理千万级数据_java_64

 

java 集合处理千万级数据_Java_65

 

java 集合处理千万级数据_实现原理_66

 深入 java8 的集合 3:HashMap 的实现原理

java 集合处理千万级数据_Java_67

 

java 集合处理千万级数据_java_68

 

java 集合处理千万级数据_java 集合处理千万级数据_69

 

java 集合处理千万级数据_实现原理_70

 

java 集合处理千万级数据_Java_71

java 集合处理千万级数据_Java_72

 

java 集合处理千万级数据_java_73

 

java 集合处理千万级数据_开发语言_74

 

java 集合处理千万级数据_java_75

 

java 集合处理千万级数据_java_76

 

java 集合处理千万级数据_java 集合处理千万级数据_77

 

java 集合处理千万级数据_java_78

 

java 集合处理千万级数据_实现原理_79

 

java 集合处理千万级数据_java 集合处理千万级数据_80

 

java 集合处理千万级数据_java 集合处理千万级数据_81

 

java 集合处理千万级数据_Java_82

 

java 集合处理千万级数据_java_83

 

java 集合处理千万级数据_Java_84

 

java 集合处理千万级数据_Java_85

 

java 集合处理千万级数据_开发语言_86

 深入 java8 的集合 4:LinkedHashMap 的实现原理

java 集合处理千万级数据_java 集合处理千万级数据_87

 

java 集合处理千万级数据_实现原理_88

 

java 集合处理千万级数据_java 集合处理千万级数据_89

 

java 集合处理千万级数据_开发语言_90

 

java 集合处理千万级数据_java_91

 

java 集合处理千万级数据_java_92

 

java 集合处理千万级数据_java_93

 深入 java8 的集合 5:Hashtable 的实现原理

java 集合处理千万级数据_java 集合处理千万级数据_94

 

java 集合处理千万级数据_Java_95

 

java 集合处理千万级数据_java 集合处理千万级数据_96

 

java 集合处理千万级数据_开发语言_97

 

java 集合处理千万级数据_开发语言_98

java 集合处理千万级数据_实现原理_99

 

java 集合处理千万级数据_java_100

 

java 集合处理千万级数据_java 集合处理千万级数据_101

 深入分析 HashMap

 

java 集合处理千万级数据_java_102

 

java 集合处理千万级数据_实现原理_103

 

java 集合处理千万级数据_java 集合处理千万级数据_104

 

java 集合处理千万级数据_开发语言_105

 

java 集合处理千万级数据_Java_106

 

java 集合处理千万级数据_java 集合处理千万级数据_107

 

java 集合处理千万级数据_实现原理_108

 

java 集合处理千万级数据_Java_109

 

java 集合处理千万级数据_java 集合处理千万级数据_110

 

java 集合处理千万级数据_java_111

参考链接:

(1)红黑树的性质:

(2)JDK1.8 HashMap 性能的提升:

文件:JDK7u7_src.zip