HashMap 哈希算法
面试官问:"HashMap 的 hash 方法是怎么实现的?"
候选人小蒋答:"调用 key 的 hashCode()。"
面试官追问:"那 JDK 8 的 hash 方法做了什么额外处理?"
小蒋说:"好像是做了一个移位运算..."
面试官继续追问:"为什么要这么做?"
小蒋答不上来。
【面试官心理】 这道题考查的是候选人对 HashMap 哈希算法的理解深度。能说出"扰动函数"和"高位低位异或"原理的候选人,说明真正理解过 HashMap 的设计意图。
一、hash 方法源码解析 🔴
JDK 8 的 hash 方法做了两件事:
- 计算 key 的 hashCode(32 位 int)
- 将 hashCode 的高 16 位与低 16 位异或
二、为什么要扰动?🔴
2.1 问题:低位分布不均匀
2.2 解决方案:扰动函数
2.3 扰动效果示例
三、为什么容量必须是 2 的幂次 🔴
3.1 取模 vs 位运算
3.2 性能对比
位运算比取模快 10-20 倍!
3.3 HashMap 如何保证 n 是 2 的幂次
四、tableSizeFor 算法解析 🔴
五、追问升级
面试官:"如果 HashMap 的容量不是 2 的幂次,会发生什么?"
问题:位运算 hash & (n-1) 不再等价于 hash % n,哈希分布会变得不均匀。
面试官:"自定义对象做 HashMap 的 key,需要注意什么?"
【面试官心理】 能说出"equals 和 hashCode 必须同时重写"并给出正确实现的候选人,说明有工程实践。这是 HashMap 相关题目的基本要求。