Android HashMap的resize方法中(e.hash & oldCap) == 0

本文揭示了当e.hash与oldCap(如16)的按位与运算结果为0时,e.hash的特定位模式与节点数组下标的关系。通过实例分析,发现e.hash的后五位为0时,e.hash与oldCap-1和2oldCap-1的按位与结果相同,表明下标位置不变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、当(e.hash & oldCap) == 0时,我们看看下面这两个表达式会有什么规律:

e.hash & (oldCap-1) 和 e.hash & (2oldCap-1)

        e.hash & (oldCap-1) 表示老的节点数组中,节点的下标位置;

        e.hash & (2oldCap-1) 表示在新的节点数组中,新节点的下标位置;

当e.hash & oldCap == 0,hashMap中,oldCap默认是16;所以,e.hash & 16 = 0即:

e.hash & 10000 = 0

要想等式成立,那么e.hash的倒数第五值肯定是0,其他的位,可以是任意值,即:

e.hash的后五位肯定是:...0 xxxx

这时我们先看e.hash & (oldCap-1) 

                =    e.hash & (16-1)

                =    e.hash & (15)

                =    e.hash & 0 1111

我们再看e.hash & (2oldCap -1 )

              =   e.hash & (2*16 -1)

              =   e.hash & 31

              =   e.hash & 01 1111

因为 e.hash的后五位是:0 xxxx  ,所以e.hash & 01 1111的结果,倒数第五位肯定是0,

所以结果可以写成: e.hash & 00 1111 而它和 e.hash & 0 1111是一致的

所以 它就等于e.hash & (oldCap-1) 

所以当(e.hash & oldCap) == 0时,e.hash & (oldCap-1) 和e.hash & (2oldCap -1 )相等;即,它们的下标数值是相等的;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jian11058

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值