HashMap的底层实现

JDK7:

HashMap map=new HashMap();
在实例化之后,底层创建了长度为为16的Entry[ ] table。
map.put(key1,value1);
首先,调用key1所在类的hashcode()方法得出key1的哈希值,此哈希值经过某种算法运算获得在Entry数组中的存放位置。
如果此位置为空,此时Entry添加成功。
如果此位置不为空(意味着此位置上有一个或多个数据(以链表形式存在)),比较key1与当前位置上数据的哈希值,
如果1:key1的哈希值与已经存在数据的哈希值都不相同,此时key1-value1将添加成功。
如果2:key1的哈希值与已经存在的某一个数据哈希值(key2-vaule2)相同则继续比较:调用key1所在类的equals()方法比较:

如果equals()返回false:此时key1-value1将添加成功;
如果equals()返回true: 使用value1替换value2.

在不断添加的过程中,会涉及到扩容问题,默认的扩容方式:扩容为原来容量的二倍并将原有的数据复制过来

JDK8:不同点

HashMap map=new HashMap();
1在实例化时,底层没有创建一个长度为16的数组。
2JDK8底层的数组是Node类型,而非Entry[ ]
3首次调用put()方法时,底层创建长度为16的数组
4JDK7的底层结构是数组+链表,JDK8底层数组+链表+红黑树:
当数组上某一索引位置以链表形式存储的数据个数超过8个且数组的长度超过64时,数据采用红黑树存储

HashMap源码中的重要常量

HashMap的底层实现_第1张图片
HashMap的底层实现_第2张图片

你可能感兴趣的:(java,数据结构)