深圳市点击未来科技网站建设网站开发啊
2026/5/18 19:48:54 网站建设 项目流程
深圳市点击未来科技网站建设,网站开发啊,网页搜索,沪佳装修贵吗面试官#xff08;张姐#xff09;#xff1a;哈喽 malog#xff01;今天咱们聚焦下 HashMap 的源码细节 —— 这可是 Java 面试的 “必考题”#xff0c;你平时有没有扒过它的 put 方法流程呀#xff1f;malog#xff1a;张姐好#xff01;必须扒过#xff5e;毕竟写…面试官张姐哈喽 malog今天咱们聚焦下 HashMap 的源码细节 —— 这可是 Java 面试的 “必考题”你平时有没有扒过它的 put 方法流程呀malog张姐好必须扒过毕竟写业务代码天天用 HashMap不搞懂源码总觉得心里没底哈哈。问答环节面试官张姐那你先给我捋捋HashMap 调用 put 方法时底层的 putVal 是咋干活的malog行putVal 的流程大概分 “初始化→算索引→插数据→查扩容” 这几步首先会先瞅 table 数组是不是空的要是没初始化就调用 resize () 整个默认长度 16 的数组然后给 key 算 hash 值 —— 这里有个 “扰动算法”把 key 的 hashCode 高 16 位和低 16 位异或一下再和数组长度减 1 做位运算算出要放的索引位置。要是这索引位置是空桶table [i] null直接插新节点就行要是非空就分情况要么 key 重复了直接覆盖 value要么是红黑树节点就往树里插要么是链表就遍历到尾巴插新节点 —— 插完还得看链表长度是不是超 8不过光超 8 还不够得数组长度也超 64 才会转红黑树不然只是扩容最后插完了要是 size 超过阈值容量 ×0.75就再 resize 扩容。面试官张姐细节挺到位那我追问下那个 “扰动算法” 到底为啥要搞个高 16 位和低 16 位异或直接用 hashCode 不行吗malog还真不行比如数组初始长度是 16(n-1) 就是 15二进制是 00001111要是直接用 hashCode 和它做位运算只有低 4 位参与计算高 16 位的特征就浪费了很容易撞哈希冲突。把高 16 位和低 16 位异或相当于让高位的 “特征” 也混到低位里散列性更好能少点冲突面试官张姐懂了那常有人说 “HashMap 链表长度到 8 就转红黑树”这说法对吗malog这是个常见误区得满足两个条件链表长度 8 且 数组长度 64。要是数组长度没到 64就算链表长过 8也不会转红黑树而是触发扩容 —— 毕竟数组太小的时候树化反而占内存不如先扩容让数据更分散面试官张姐那 put 完之后啥时候会触发扩容扩容是咋扩的malog当 size实际存储的键值对数量超过阈值threshold 容量 × 负载因子默认负载因子是 0.75的时候就会调用 resize () 扩容。扩容是把数组容量翻倍然后把旧数组里的节点重新计算索引迁移到新数组里 ——Java 8 之后迁移的时候还会顺便把链表拆成两个效率比之前高不少。面试官张姐不错不错源码细节吃得挺透重点问题和参考回答序号重点问题参考回答1HashMap 的 put 方法底层putVal流程是啥分 4 步① 检查 table 数组未初始化则调用 resize () 初始化默认长度 16② 用 “扰动算法” 计算 key 的 hash 值结合数组长度得到索引③ 空桶直接插节点非空则分情况key 重复覆盖 value / 红黑树插入 / 链表尾插满足条件则树化④ 插入后 size 超阈值则触发 resize () 扩容。2扰动算法hash 方法的作用是啥把 key 的 hashCode 高 16 位与低 16 位异或让高位特征参与索引计算增强散列性减少哈希冲突避免仅低几位参与运算导致的冲突。3HashMap 链表转红黑树的条件是啥需同时满足① 链表长度 8② 数组长度 64。若数组长度不足 64链表超长会触发扩容而非树化。4HashMap 的扩容触发条件和扩容逻辑是啥触发条件size实际键值对数量 阈值容量 × 负载因子 0.75扩容逻辑数组容量翻倍重新计算旧节点的索引并迁移到新数组Java 8 后会拆分链表提升效率。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询