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/...