HashMap的长度为什么是2的N次方

1.减小哈希冲突概率
假如当前Entry数组长度为len,插入节点时,需要对key的hashcode进行二次哈希,然后跟len-1相与(得到的值一定小于len,避免数组越界)
如果len是2的N次方,那么len-1的后N位二进制一定是全1

假设有两个key,他们的hashcode不同(假设hashcode长度大于len-1的长度),分别为code1和code2
code1和code2分别与一个后N位全1的二进制相与,结果一定也不同、
(hashcode长度小于len-1的长度时,该结论不成立。比如code1=1011 1011,code2=10001011,与length-1=01111进行与运算,得到的结果即数组下标是一样的,但是他们的hash值不同)

但是,如果code1和code2分别与一个后N位非全1的二进制相与,结果有可能相同

也就是说,如果len是2^N,不同hashcode的key计算出来的数组下标一定不同;
否则,不同hashcode的key计算出来的数组下标一定相同。

所以HashMap长度为全1,可以减小哈希冲突概率。

2.提高计算下标的效率
如果len的二进制后n位非全1,与len-1相与时,0与1相与需要取反。
如果len的二进制后n位全1,完全不需要取反。

如果len为2^N,那么与len-1相与,跟取余len等价,而与运算效率高于取余。
如果len不是2^N,与len-1相与,跟取余len不等价。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值