tab[i = (n - 1) & hash] 的详细解读

tab[i = (n - 1) & hash] 的详细解读

n代表tab数组的容量16 -1(数组下标索引从0开始)
这里的hash是经过hash(key)计算好的

首先按位与操作(&),就是将两个操作数转换成2进制,根据1 1 = 1 ,1 0 = 0, 0 0 = 0的规则进行计算

按照上边程序的数据,来做分析

在这里插入图片描述

当前的hash:2080,n = 16

(n - 1) & hash = 15 & 2080

在这里插入图片描述

设想一下按位与操作1 1 才得1,而15的二进制数为0000 0000 0000 1111 前12位为0基本不用看了,不管2080的二进制数0000 1000 0010 0000 前12位是多少,最终的结果的前12位都是为0

tab[i = (n - 1) & hash] 的设计,保证了i的取值在[0,15]这个闭区间内

还有一个重要的原因,就是 (n-1)& hash = hash % n ,想要满足这条等式的前提就是,n必须是 2的a次幂才行

为什么呢?

因为2的n次幂的10进制数转换为2进制数,就只有一个1,其余都为0,比如说 16(十进制)= 10000(二进制)

16 = 2^4 转换为2进制后在n=4前一位就是1,也就是10000,而前面的15是通过16-1的来的,也就是10000-1 得到01111,此时将2080转换为2进制为0000 1000 0010 0000,与01111进行按位与操作,最终的结果等于2080%16 = 0

总结 当一个数满足 m = 2^n 则 a % m = a & (m-1)

到这里很多小伙伴就会问,为什么要这么做呢?

首先2进制位运算肯定比取余运算快,其次不管是HashSet,LinkHashSet维护的table的容量都是2^n方,这也保证了(n-1)& hash 设计的合理性

在这里插入图片描述

以上内容仅为个人解读,如有误解,请在评论中指教,谢谢

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值