结论:返回大于或等于参数的最小2的n次方数
关于cap - 1:让函数在参数本身即为2的n次方数的情况下,返回参数本身
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;
}
示例
在查看示例前,确保已了解位运算与移位运算
关于位运算与移位运算,可参照:
Java_位运算符简述_Mudrock__的博客-CSDN博客
Java_移位运算简述_Mudrock__的博客-CSDN博客
情况01:参数本身即为2的n次方数
假定传入的初始容量为16,即0001 0000,则该函数的运行步骤为:
0001 0000 - 0000 0001 = 0000 1111
0000 1111 | 0000 0111 = 0000 1111
0000 1111 | 0000 0011 = 0000 1111
........(后续步骤得到的结果均为0000 1111)
0000 1111 + 0000 0001 = 0001 0000
0001 0000转换为十进制即为16,所以函数最终返回的是16本身
情况02:参数本身不是2的n次方数
假定传入的初始容量为12,即0000 1100,则该函数的运行步骤为:
0000 1100 - 0000 0001 = 0000 1011
0000 1011 | 0000 0101 = 0000 1111
0000 1111 | 0000 0011 = 0000 1111
........(后续步骤得到的结果均为0000 1111)
0000 1111 + 0000 0001 = 0001 0000
0001 0000转换为十进制即为16,所以函数最终返回的是大于或等于12的最小2的n次方数
但是需要注意的是,若计算后得到的容量>MAXIMUM_PACACITY,则直接返回MAXIMUM_PACACITY