HashMap中tableSizeFor的一个精巧的算法

代码如下:
static final int tableSizeFor(int cap) {
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
tableSizeFor(int cap)是hashMap中的一个Static函数,主要功能是返回一个比给定整数大且最接近的2的幂次方整数,如给定10,返回2的4次方16.
这个算法的原理是什么呢:
我们首先假定cap也就是给定数的的形式为00..01XXXXXXX,(X代表可为0也可为1,X前面的1为从最高位开始第一个为1的那一位)
首先是n |= n >>> 1;也就是n变成n与n右移一位之后异或后的值,即
n: 00..01XXXXXXX
n>>>1:00..001XXXXXX
新n: 00..011XXXXXX
也许到这里你还看不出什么结果,那接着看第二步n |= n >>> 2;也就是n变成n与n右移两位之后异或的值,即
n: 00..011XXXXXX
n>>>2:00..00011XXXX
新n: 00..01111XXXX
到这里就不用再解释了吧,这个算法不断的通过把第一个1开始后面的位变成1,本例由00..01XXXXXXX->00..011111111,最后再返回n+1;
太精巧了这个算法!!!!!

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值