HashMap
Java HashMap采用了多次无符号位移运算计算容量,返回大于当前容量的符合2^n整型值:
1.首先cap-1是为了保证通用性,防止已经是2^n的情况,二进制1000进行下述运算会得到10000,其实1000就够了
2.依次位移了31位,搭配逻辑或运算,可以使任何非0的正数首位1之后的所有位都变为1,最后加1,得到100...的状态,符合2^n
static final int tableSizeFor(int cap) {
int n = cap - 1;
n |= n >>> 1;//首位1个1之后的1位变为1,首位2个1
n |= n >>> 2;//首位2个1之后的2位变为1,首位4个1
n |= n >>> 4;//首位4个1之后的4位变为1,首位8个1
n |= n >>> 8;//首位8个1之后的8位变为1,首位16个1
n |= n >>> 16;//全部变为1
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}