共计 451 个字符,预计需要花费 2 分钟才能阅读完成。
HashMap 的 hash 函数实现原理
1、JDK 1.8 中,通过 key 的 hashCode() 办法失去值的高 16 位异或低 16 位实现的:
(h = k.hashCode()) ^ (h >>> 16)
2、应用计算失去的 hash 值与数组长度 n - 1 做与位运算失去数组下标:
if ((p = tab[i = (n - 1) & hash]) == null)
为什么应用异或运算?
这段代码叫“扰动函数”,目标是为了混合原 hash 码的高位和位置,混合后的低位掺杂了高位的局部特色,这样高位的信息也被变相的保留下来
- 计算失去 hash 值后须要与数组长度 - 1 做与位运算失去元素所在数组下标地位,此时数组长度 - 1 相当于一个“低位掩码”,后果是 hash 值的高位全副归零,只保留低位值
- hashCode 函数返回的 int 值范畴为 32 位,右移 16 位再异或,相当于本人的高半区和低半区做异或,这样失去的 hash 值混合了原始 hash 码高位和低位的特色,缩小了 hash 碰撞的几率
为什么用异或,不必与和或运算?
图片转自:https://zhuanlan.zhihu.com/p/…
正文完