HashMap的底层实现原理
对于JDK7而言
1.HashMap hashMap = new HashMap();
- 在实例化之后,底层创建了一个长度16的Entry[] table
2.hashMap.put(key1,value1)
-
首先,调用key1所在类的hashCode(),计算key1的哈希值hashValue,hashValue经过某种计算得到key1在Entry中的位置sit1
-
如果sit1上没有数据,key1-value1添加成功 —情况1
-
如果sit1上有数据,比价key1的哈希值和site1上寂静存在的一个或多个数据的哈希值
1.如果key1的哈希值与其他数据的哈希值不同,key1-value1添加成功 —情况2
2.如果key1的哈希值与其他数据的某一个数据key2的哈希值相同,调用key1虽在类的equals()与之比较,
如果返回False,keys-value1添加成功 —情况3
如果返回True,那么将会使用value1替换key2对应的value2 —情况4
3.上述的情况2、情况3,key-value与该位置上已经存在的数据是以链表的方式进行存储的
对于JDK8而言
1.HashMap hashMap = new HashMap()
-
在实例化之后,底层没有创建了一个长度16的数组
-
jdk8中的数组名字为Node不是Entry
2.hashMap.put(key1,value1)
-
在调用put()之后,底层创建了一个长度16的Node[]
-
存储过程和JDK7基本相同
-
但是有一点不同,当数组的某个位置上的元素个数>8 且
数组的长度>64时,此时此索引位置上所有的数据改为使用“红黑树”存储。这样做的目的是为了在遍历时,提高遍历效率。