hashmap 中的hash值计算

img


为什么要异或 右移16这个值,不能直接用key.hashcode()这个方法吗

原因图片上写了,为了减少冲突
不能

比较复杂,大概这么跟你说吧
1、后续还要进行新hash计算,计算得到数组下标。用的是:1⃣️(新数组长度—1)& hash
2、一般新数组的长度不超过2^16,所以如果不右移16位,直接使用key.hashCode,那基本上只有原来的低16位参与1⃣️计算。也就是说结果基本只带有低16位的特征,碰撞就会大大增加
3、如果右移16位与原hashcode进行异或运算。得到的hash值已经是带有高低16位混合的特征了,再参与1⃣️计算,因为此时低16位已经被扰动了,是混合特征的,拿去做与运算就能实现均匀散列分布

比较复杂,大概这么跟你说吧
1、后续还要进行新hash计算,计算得到数组下标。用的是:1⃣️(新数组长度—1)& hash
2、一般新数组的长度不超过2^16,所以如果不右移16位,直接使用key.hashCode,那基本上只有原来的低16位参与1⃣️计算。也就是说结果基本只带有低16位的特征,碰撞就会大大增加
3、如果右移16位与原hashcode进行异或运算。得到的hash值已经是带有高低16位混合的特征了,再参与1⃣️计算,因为此时低16位已经被扰动了,是混合特征的,拿去做与运算就能实现均匀散列分布