千家信息网

如何解析Java8 HashMap扩容算法

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇文章为大家展示了如何解析Java8 HashMap扩容算法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java8的HashMap扩容过程主要就是集中在r
千家信息网最后更新 2026年11月02日如何解析Java8 HashMap扩容算法

本篇文章为大家展示了如何解析Java8 HashMap扩容算法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

Java8的HashMap扩容过程主要就是集中在resize()方法中

final Node[] resize() { // ...省略不重要的 }

其中,当HashMap扩容完毕之后,需要对原有的数据进行转移。因为容量变大了,部分元素的位置因此要变更,因而出现了下面的这个转移过程。

转移过程大致是:依次从旧数组里取值,然后从该值对应的链表上依次取出节点,对节点取模分别放入lo链表和hi链表,当链表中节点遍历完后,分别把lo链表和hi链表放入新数组的不同位置。

在看到如下第15行时,我在想,为什么(e.hash & oldCap)== 0时就放入lo链表,否则就是hi链表?

说到这个问题,那我们就要回顾下HashMap存入新元素的过程了。看下面的第45行,可以发现插入时是使用(n - 1) & hash来计算位置的,即数组长度-1,而扩容移位是使用数组长度n计算的,那这是为什么呢?

for (int j = 0; j < oldCap; ++j) { Node e; if ((e = oldTab[j]) != null) { oldTab[j] = null; if (e.next == null) newTab[e.hash & (newCap - 1)] = e; else if (e instanceof TreeNode) ((TreeNode)e).split(this, newTab, j, oldCap); else { // preserve order Node loHead = null, loTail = null; Node hiHead = null, hiTail = null; Node next; do { next = e.next; if ((e.hash & oldCap) == 0) { if (loTail == null) loHead = e; else loTail.next = e; loTail = e; } else { if (hiTail == null) hiHead = e; else hiTail.next = e; hiTail = e; } } while ((e = next) != null); if (loTail != null) { loTail.next = null; newTab[j] = loHead; } if (hiTail != null) { hiTail.next = null; newTab[j + oldCap] = hiHead; } } }}final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { // ...省略不重要的 if ((p = tab[i = (n - 1) & hash]) == null) tab[i] = newNode(hash, key, value, null); else { // ...省略不重要的}

像我们看Java8的HashMap源码,应该都应该知道HashMap的底层数组长度都是2的n方的值

那么我们就假设一个底层数组长度为8的HashMap模拟进行插入元素和扩容移位的过程

长度n=8 ----> 0x1000

n-1   ----> 0x0111

此时写入两个元素,两个元素的hash值分别为hash2 = 0x0101,hash3 = 0x1101

hash2 & n-1 = 0x0101

hash3 & n-1 = 0x0101

两个hash取模后的结果是一致的,所以它们会在同一个地方组成链表

那么此时如果要进行扩容移位呢?

hash2 & n = 0x0000

hash3 & n = 0x1000

此时两者的结果是不一样的,并且相差0x1000即10进制的8即数组长度.。

所以这也就是为什么上图15行只判断==0的原因,因为这个取模结果只有0和1两种值(数组长度是2的n次方,只有除了符号位外的最高位为1)

而两个取模结果等于数组长度,这也就是为什么上图第32和36行那么处理的原因。

上述内容就是如何解析Java8 HashMap扩容算法,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

数组 长度 元素 过程 两个 结果 重要 位置 就是 节点 算法 上图 也就是 内容 原因 只有 底层 技能 知识 面的 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 湖北九亚互联网络科技有限公司 互联网科技活动banner 新华互联网科技学院 掌上梦互联网科技 互联网科技网站 互联网科技的未来发展 济南和联互联网科技有限公司 互联网科技公司需要的职位 互联网金融科技公司干啥的 互联网科技创新服务 福建科技产业互联网发展 互联网科技商业 互联网与医疗科技 特约风豹互联网科技为什么扣费 华中科技大学互联网的牛人 无锡工业互联网科技有限公司 启辰互联网科技 工业互联网科技成果转化 全球科技与互联网公司市值变化 伍佰万互联网科技是干嘛的 北京互联网科技有限公司 剑昆互联网络科技有限公司临桂 青海科技产业互联网发展 科技类公司包括互联网吗 福建互联网展示科技馆设计 互联网科技机房 互联网科技的前景 北京品多多互联网科技有限公司 恒生科技互联网指数十大成分股 互联网科技快速发展优美句子
0