tableSizeFor():(不考虑大于最大容量的情况)是返回大于输入参数且最近的2的整数次幂的数。比如10,则返回16。该算法源码如下:
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;
}
先来分析有关n位操作部分:先来假设n的二进制为01xxx…xxx。接着
n |= n >>> 1; (对n右移1位:001xx…xxx,再位或:011xx…xxx)
n |= n >>> 2; (对n右移2为:00011…xxx,再位或:01111…xxx)
n |= n >>> 4; (此时前面已经有4个1了,再右移4位且位或可得8个1)
n |= n >>> 8; (此时前面已经有8个1了,再右移8位且位或可得16个1)
n |= n >>> 16; (此时前面已经有16个1了,再右移16位且位或可得32个1)
综上可得,该算法让最高位的1后面的位全变为1。
最后再让结果n+1,即得到了2的整数次幂的值了。
现在回来看看第一条语句:int n = cap - 1;
让cap-1再赋值给n的目的是另找到的目标值大于或等于原值。例如二进制1000,十进制数值为8。如果不对它减1而直接操作,将得到答案10000,即16。显然不是结果。减1后二进制为111,再进行操作则会得到原来的数值1000,即8。
例子:
十进制12,减一后11,11的二进制位1011,操作后得到10000,即16
十进制17,减一后16,11的二进制位10000,操作后得到100000,即32