1.14 HashMap的长度为什么是2的幂次方

1.14 HashMap的长度为什么是2的幂次方

设计原理:
JDK1.8之前,hash–>数组下标的过程很简单,hash%length,就可以将hash映射到数组上
JDK1.8优化思路,已知位运算 a % 2n = a & 2n - 1(因为2n -1刚好是一个低位掩码,a&小1位的低位掩码相当于截取了低一位的所有二进制数,起到了a%2n效果)
所以对于指定的值,将数组长度设置为大于等于该值的最小2 n,就可以用位运算优化;

如何保证数组长度是2n
在HashMap的tableSizeFor方法中实现;
实现思路:
想要得到比给定数大的最小2的幂次方,那么这个2的幂次方一定是比这个值多出一位的1000…0,那么我们只要想办法得到和给定数等位数的11…1,再让它+1,就能够得到我们想要的值;
那么如何让给定值变成等位数的11…1呢?
对于给定值,它的最高位一定是1,不管后面的值是多少,只要让这个1往后复制1位,有两个位一定是1,再让这两个位往后复制,就会有4个位是1…
即时这个给定的值再大,甚至最高位1在第32位上,那我让它复制到16个位一起往后复制也够了,怎么也能保证其他31位全变成1了;
那此时的问题转化为如何让这个最高位一直自我复制了:
可以想到,我们让这个给定值往右移一位,在和原来的值进行按位或|运算,能保证2个,再移2位,保证4个,再右移4位,保证8个,再右移8位,保证16个,再右移16个,保证32个;
这时什么指定值都不怕了;
另外,如果这个值本身就是2的幂次方,我们也不需要获得比它高一位的2的幂次方,让它能够获得自己就行,让它减1再进行操作,获得的大于等于结果的最小2幂次方就是自己;
而且减1操作对于非2幂次方值来说,不会改变大于等于它最小幂次方的数是哪个的结果;
总结:
将指定值-1;
|=向右移1位的值;
|=向右移2位的值;
|=向右4位;
|=向右8位;
|=向右16位;
结果+1;
得到大于等于指定值的最小2的幂次方;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值