理解HashMap的容量为何是2的N次方

在阅读HashMap的原理文章的时候,其中有一个知识点说的是HashMap的数组长度是2的N次方,即使调用含有容量参数的构造方法,内部也会将数组长度调整到2的N次方.这么做最大的原因,是为了减少哈希冲突,尽量散列.我看了几篇文章,没有完全解释清楚为何能减少,所以我多看了几遍源码,加上根据我自己的理解,确定是利用了二进制按位与的特点

假如数组长度是16,put操作的时候都是拿元素的hash key和数组长度-1进行的按位与

所以获取下标的公式是:x&1111,x指hash key

证明如下:(x1,x2的hash key只有4位)

1:有两个不同的x1,x2和1111按位与.

按照按位与的特点,x1,x2其中肯定某一位不同,假设是i位,和1111中的i位按位于,结果必然不同.

2:有两个不同的x1,x2,和小于15的长度按位与.也即****,其中必然有一位是0,假设是在i位

x1,x2恰好在i位不一样,但是和****的i位按位与,结果都是0.也即结果出现了,不同的x1,x2,最后和****按位与的结果一样,发生了hash冲突.

总结:如果不是2的N次方-1,不同的x1,x2,计算得到的下标位置可能一样,但如果是2的N次方-1,不同的x1,x2,结算得到的下表位置必然不一样.hash冲突肯定也是2的N次方来的少

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值