§2.3.1 HashMap原理
考察意图:是否理解HashMap的数据结构演进、put流程、扩容与树化等关键机制。
回答样板:
底层结构:JDK 7:数组+链表。JDK 8:数组+链表/红黑树。
put流程:
- 计算key的hash值(高16位异或低16位,降低hash冲突)
- 定位桶:
(n - 1) & hash - 无冲突 → 直接放入
- 有冲突 → 判断equals → 相同则覆盖,不同则尾插(JDK 7是头插,JDK 8改尾插避免死链)
- 链表长度 > 8 且数组长度 ≥ 64 → 树化为红黑树
- 容量超过 threshold(capacity × loadFactor)→ 扩容
扩容机制:2倍扩容,JDK 8做了rehash优化——原hash值与oldCap按位与,结果为0留在原位,为1移到"原位置+oldCap",省去了每次rebuild hash表的开销。
负载因子0.75:时间和空间的折中。太低(如0.5)浪费内存;太高(如1)hash冲突增加,影响查询性能。
红黑树退化:resize时如果树的节点数 ≤ 6,退化为链表。
陷阱提示:说"HashMap线程安全";不知道树化阈值是链表长度>8且数组长度≥64两个条件缺一不可。