代码如下:
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是n-1=9 二进制位为1001
首先是n |= n >>> 1;也就是n变成n与n右移一位之后异或后的值,即
n: 0100
n|= n
0100
1001
|=:两个二进制对应位都为0时,结果等于0,否则结果等于1;
新n:1101
也许到这里你还看不出什么结果,那接着看第二步n |= n >>> 2;也就是n变成n与n右移两位之后异或的值,即
n: 0011
n|= n
1101
0011
新n: 1111
到这里就不用再解释了吧,这个算法不断的通过把第一个1开始后面的位变成1,本例由00…01XXXXXXX->00…011111111,最后再返回n+1;
太精巧了这个算法!!!!!
详解HashMap中tableSizeFor算法
最新推荐文章于 2022-11-05 21:24:13 发布