HashMap底层实现原理
HashMap底层实现原理
JDK7中底层实现原理
HashMap map = new HashMap();
在实例化以后,底层创建了长度为16的一维数组Entry[] table
…..已经执行过put操作…..
map.put(key1 , value1);
调用key1所在类的hashCode(),计算key1哈希值,此哈希值经过某种算法计算后,得到在Entry数组中的存放位置
- 如果此位置上为空,此时的key1-value1添加成功(存放的是entry,而entry里面有key和value)
- 如果此位置上不为空(此位置上存在一个或多个数据(以链表形式存在)),比较当前key1和已经存在的数据的哈希值
- 如果key1的哈希值与已经存在的数据的哈希值都不相同,此时key1-value1添加成功
- 如果key1的哈希值与已经存在的某一个数据的哈希值都相同,调用key1所在类的equals()方法,进行比较
- 如果equals()方法返回false,此时key1-value添加成功
- 如果equals()方法返回true,使用value1替换相同的key的value值(修改的功能)
大致过程与HashSet类似
(具体的图解可跳转到如下网址)
//www.cnblogs.com/CrabDumplings/p/13390443.html
注意:
哈希值不同的添加成功情况和equals()返回false添加成功的两种情况下:
此时key1-value1和原来的数据以链表的方式存储
在不断的添加过程中,会涉及扩容问题,当超出临界值且要存放的位置非空时,需要扩容
默认的扩容方式:扩容到原来容量的2倍,并将数据复制过来
JDK8中底层实现原理
相较于jdk7,在底层实现方面的不同如下
HashMap map = new HashMap();
- 底层没有创建一个长度为16的数组
- jdk8底层的数组:Node[],而非Entry[]数组
map.put(key1 , value1);
-
首次调用put方法时,底层创建长度为16的数组
-
jdk7底层结构:数组 + 链表
jdk8底层结构:数组 + 链表 + 红黑树
当数组的某一个索引位置上的元素以链表形式存在的数据个数大于8且当前数组的长度超过64,此时此索引位置上的所有数据改为使用红黑树存储