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;
}
这段代码解读一下 比如说你传了一个 cap为13
n= 13-1;
n=12;
n |= n >>> 1;
12的二进制 (1100)向右无符号右移1位 变成 110;
然后拿这个110 和 上面那个12的二进制1100进行 或运算 (1100|110)结果为 1110;
n |= n >>> 2;
上一步的结果为1110 再次向右移2位 得到 11;然后在和1110或运算(1110|11)结果为1111;
n |= n >>> 4;
上一步得到结果为1111 右移4位 得到 0;然后就1111|0 还是 1111;
下面就不用说了,你像→不管移多少大于4的位数都是得到的0.然后在和1111或运算最终结果还是1111
也就是15;
那在执行最终那一个return :
(n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
15不小于0,所以取后面的 15是否大于等于 后面那个值 也就是:
static final int MAXIMUM_CAPACITY = 1 << 30;
和显然不大于 那就是n+1喽 就是 16;2的4次方;
你们可以大胆的试,不管你输入什么值他最终都会得到一个和你输入值的最近的一个2的次方值且大于等于你输入的值;
别问我为什么,这大概就是那数学该死的魅力吧。