星海

Java 基础 · 主观题 · 第 7 题

Java 后端开发面试 · 第 7 题

说说 JDK 8 中 HashMap 的 put 流程。

参考答案

1. 计算哈希:hash = h ^ (h >>> 16),让高位参与运算,减少冲突。
2. 表为空时先 resize 初始化(默认容量 16,负载因子 0.75)。
3. 下标 i = (n - 1) & hash。桶为空就直接放入新节点。
4. 桶不为空:头节点的键相同(hash 相等且 equals 为 true)就覆盖值;头节点是树节点就按红黑树插入;否则遍历链表,找到相同键就覆盖,找不到就尾插(JDK 8 改为尾插,避免 JDK 7 头插在并发扩容时形成环)。
5. 链表已有 8 个节点再插入(长度超过 8)时:容量 ≥ 64 就树化,否则扩容。
6. size 超过阈值(容量 × 负载因子)就扩容为 2 倍,元素要么留在原下标,要么移到「原下标 + 旧容量」。
7. HashMap 不是线程安全的,并发场景用 ConcurrentHashMap。

解析

哈希扰动、下标计算、冲突处理、树化、扩容五个环节都要提到。

在线刷这套题:即时判分、错题本、闪卡复习,不用登录就能练。