关于HashMap中确定Hash方法的记录

#HashMap

在HashMap中需要确定Node或TreeNode节点应该连接在那个Table[index]之后
判断代码:tab[(n - 1) & hash] 此处的hash= key.hashCode() ^ (h >>> 16)
此处的n为table数组的长度

为什么要与(n-1)&

要保证所有元素都能落在table数组的范围内(不能数组长度只有16却要放到17);
因为要求了table数组长度必须是2的幂次方,故(n-1)刚好等于table.length;
使用(n-1)进行与运算,刚好取得的是hashCode的低(n-1)位既可以落在数组里

为什么hashCode要右移16位(hashCode>>>16)

上面提到了 与(n-1)相与之后取得的是hashCode的低(n-1)位,
而又因为n值不会过大(毕竟是个数组的长度),如果只取原本hashCode的低(n-1)位,
其余的高位hashCode没参与运算,都是低位参与的容易产生冲突
那我们如何让高位也参与运算呢? ===> 将hashCode(32位编码)的上一半刚好是16位右移
并用右移之后的结果与原来的hashCode进行异或运算 这样得到的结果也有高位数据的参与

(n-1)&(hashCode>>>16)

总结下来就是让hashCode的高低位都参与到与运算中,并且保证与运算之后的结果(index)是落在
数组之内的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值