/**
* Returns a power of two size for the given target capacity.
*/
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次幂,人话就是说返回比给定参数大的、最接近的2的n次方那个数
即如果传入10,返回2^4 = 16、传入18,返回2^5 = 32,传入34,应该返回2^6 = 64
测试一下
public static void main(String[] args) {
System.out.println("传入10----"+tableSizeFor(10));
System.out.println("传入18----"+tableSizeFor(18));
System.out.println("传入34----"+tableSizeFor(34));
}
static final int tableSizeFor(int cap) {
Integer MAXIMUM_CAPACITY = 1 << 30;
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;
}
结果:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CN0ETO4UjNlBjM3kDM4UjYyYzXzATNxcTM0IzLcZDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
怎么来的呢?先认识一下两个运算符
|
和
>>>
|
不用多说,二进制或,两个都为0才为0
>>>
,无符号右移
无符号右移,忽略符号位,空位都以0补齐
10进制转二进制的时候,因为二进制数一般分8位、 16位、32位以及64位(java是四个字节32位) 表示一个十进制数,所以在转换过程中,最高位会补零
来动手算一个,传入10
int n = cap - 1;
后n = 9
n |= n >>> 1;
先算
n >>> 1
,再算
n= n|前面的结果
同理,在计算```n |= n >>> 2;``,此时n已经等于13了
同理,在计算```n |= n >>> 4;``,此时n已经等于15了
到此可以看出,它的每一次运算,都是在将有0的位转换成1,直到所有位都为1为止