最近在研究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;
}
没办法,然后就找度娘啊。果然好心人还是很多的。
这个方法的目的是求一个整数最近的2的幂次方(大于)。举例就是,30<2^5(32) 那么得到的就是32 。
知道这个目的之后,再看里面的运算符是什么意思。 n |= n>>>1 即为 n = n|n>>>1。 | 符号是按位或运算。 >>> 是无符号右移运算符 无论正负,右移后,高位填充0。
那么瞬间明了,比如9 ,二进制为00001001,那么n>>>1运算后,为00000100 则 n |= n>>>1 之后为 1101,也就是13。 以此推类,接下来的分别为15,15,15,15。 最后根据三目运算符 得到 16。