privatestaticfinalinttableSizeFor(int c){ int n = c - 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; }
1. n = c-1//此时n = 12,二进制为1100 2. n |= n >>> 1; n >>> 1,也就是n右移一位,得到0110,然后再与1100或运算,得到1110,此时n=1110; 3. n |= n >>> 2; 这里n右移两位,得到0011,然后或运算得到1111;到这里n已经全为1了,不管怎么或运算,都会是1111。因此下面的几个结果都是1111 4. n |= n >>> 4; 5. n |= n >>> 8; 6 n |= n >>> 16; 7. 这里进行计算,如果n大于MAXIMUM_CAPACITY,返回MAXIMUM_CAPACITY,否则返回n+1,n目前的值是1111,是奇数,而我们要得到的是2的n次方,因此需要加一计算,得到想要的结果