JDK7与JDK8中HashMap的实现是怎样的
JDK7中HashMap的实现
JDK7中的HashMap采用了数组+链表的数据结构来实现。当插入一个键值对时,会根据Key的hashCode值计算出在数组中的位置,即数组的索引。如果该位置没有元素,则将该键值对插入到该位置;如果该位置已经有元素,即存在冲突,就会通过链表的方式来存储冲突的键值对。具体的实现步骤如下:
1. 计算Key的hashCode值:HashMap会调用Key对象的hashCode方法来计算hashCode值。
2. 计算数组索引:通过hashCode值和数组长度进行取模运算,得到该元素在数组中的索引。
3. 插入操作:如果该位置没有元素,直接插入键值对;如果该位置已经有元素,并且Key相等,则会用新的Value替换旧的Value;如果该位置已经有元素,但Key不相等,则将该键值对插入到链表中。
4. 扩容操作:当HashMap中的元素数量达到一定阈值时,会触发扩容操作。具体情况是当元素数量达到数组容量的75%时,会进行扩容。扩容操作会新建一个更大的数组,然后将原数组中的所有元素重新计算索引,并插入到新数组中。
JDK8中HashMap的实现
JDK8中的HashMap与JDK7的实现相比,在处理哈希冲突的方式上有所不同,以提高查询效率。具体的实现步骤如下:
1. 计算Key的hashCode值:与JDK7相同,HashMap会调用Key对象的hashCode方法来计算hashCode值。
2. 计算数组索引:与JDK7相同,通过hashCode值和数组长度进行取模运算,得到该元素在数组中的索引。
3. 插入操作:与JDK7不同的是,在该位置已经有元素,并且Key相等的情况下,会用新的Value替换旧的Value,不再使用链表的方式来存储冲突的键值对。如果该位置已经有元素,但Key不相等,则会使用链表或红黑树的方式来存储冲突的键值对。
4. 扩容操作:与JDK7相同,当HashMap中的元素数量达到一定阈值时,会触发扩容操作。具体情况是当元素数量达到数组容量的75%时,会进行扩容。不同之处在于,JDK8中扩容后的新数组长度为原数组长度的两倍。
在JDK8中,当链表中的元素数量大于阈值(默认值为8)时,会将链表转化为红黑树,以提高查询的效率。红黑树是一种自平衡的二叉查找树,其时间复杂度为O(logN),相较于链表的O(N),查询效率得到了极大的提升。同时,红黑树的插入、删除等操作的时间复杂度也较低,因此在元素数量较多时,HashMap采用红黑树来存储冲突的键值对。
猜您想看
-
如何快速修复电脑蓝屏问题?
如何快速修复电...
2023年04月18日 -
用一条SQL插入跟更新执行流程以及日志系统原理
SQL插入与更...
2023年07月23日 -
kubernetes怎么将容器指定到某些节点运行
在Kubern...
2023年07月22日 -
如何在Steam公开商店上发布我的游戏?
Steam是一...
2023年05月03日 -
EEPROM 中怎么利用CAT24CXX实现分页读写数据
1、CAT24...
2023年05月26日 -
手机自带浏览器无法正常使用怎么办?
随着移动互联网...
2023年04月28日