HashMap hash函数分析

查看Hashmap的put方法时 会有这么一段

         

       我们知道这里调用的是Object的hashCode() 返回的是key内存地址 然后将内存地址和对内存地址进行无符号右移的新     值进行异或运算。 

       我们会产生一个问题 ?  为什么做这样的处理呢。

       我们继续看这个返回的h传到了哪里

       

       传递到了hash参数里面   

        我们知道初始的容量是16 即n经过resize()后被赋值16  

       p= tab[i=(n-1)&hash] 这一行 可以知道 索引i 的值为 15&hash hash就是处理过的hash值 ,我们不妨假设如果该hash值的最后4位都是0 则与运算之后的结果必定是0 即放在Entry数组的第一个位置,这样就会导致一个桶上的元素过多,降低hashmap的性能,所以我们之前的处理就是为了解决这个问题,也就是说影响结果的位数不止仅由后四位决定,通过由更多位的参与运算得到一个更加均匀分布的entry数组,有效的提高了性能。

     那我们又会有一个思考 为什么要用异或运算呢? 列举分析,如果用&或 | 运算,那么有0则0或有1则1 每种可能都是75%,如果用异或 则可以均衡1和0的分布,这个应该比较容易理解。至于无符号右移16 可能是根据int的位数决定的,还需要进一步学习与思考。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值