JDK源码阅读之HashMap -- hash值计算方式、下标查找及tableSizeFor方法

1. HashMap中的hash计算方式(为什么)

减少hash是的碰撞

2. 下表查找(和hash值的关系)

hashcode ^ (hashcode >>> 16),让低16位同时包含了高位和低位的信息,在计算下标时,由于高位和低位的同时参与,减少hash的碰撞。

(n - 1) & hashCode:n - 1 使得低位全为1,高位全为0,位与之后的结果一定在0 ---> n-1范围内


发展过程:

1. put到HashMap中的Object,我们视为它合理的实现了hashCode方法,该方法可以达到良好的散列效果,即碰很少重复

2. 既然hashCode合理,我们就可以考虑用它来散列(分桶)对象

3. 由于需要将对象散列到一定编号范围的捅中(0 -- n),由于n(表大小)是2的整数次方,可以采用n-1和hashcode按位与,得到的结果是在桶范围内,上述我们是hashCode为散列良好的,所以(n -1)&hashCode的计算结果可视为应该分布均匀的。

4. 上述有一个问题,(n -1)&hashCode的计算方式中,假设n=16,那么hashCode其实只有低4位参与了计算,为了进一步降低碰撞的发生,hashCode的计算方式改为了hashcode ^ (hashcode >>> 16),使得低位中同时包含了低位和高位的信息。



时间问题,暂随意记录,待稍后完善...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值