先上源码:
static final int tableSizeFor(int i) {//i为自定义容器的大小
int j = i - 1;
j |= j >>> 1;
j |= j >>> 2;
j |= j >>> 4;
j |= j >>> 8;
j |= j >>> 16;
return j >= 0 ? j < MAXIMUM_CAPACITY? j + 1 : MAXIMUM_CAPACITY: 1;
}
这段代码的作用是将一个非负整数(自定义大小)转换成第一个大于等于它本身的2的幂次方的数。
例如,设置大小为9,则经过计算得到16。 基本思路:二进制下低位全部转换成1,再加一,大小为9的时候,00001001,要得到00001111,再加一得到00010000,即16。
具体计算过程如下: 第一步:j |= j >>> 1;
00001000 >>> 1 ==> 00000100 00001000 | 00000100 ==> 00001100
第二步:j |= j >>> 2;
00001100 >>> 2 ==> 00000011 00001100 | 00000011 ==> 00001111
第三步、第四步同样。
原理: 利用非负整数第一位二进制为1的特点,结合左移和或运算,将原数据低位转换成1。
细节: 1、算法开头需要将原始大小减一,目的是考虑原始大小为2的幂次方时,得到结果还是其本身。 2、返回值:必须为非负整数,否则返回1,若超过最大值,则返回最大值(int能存储的最大值) 3、为什么左移16位就计算结束了?因为int
类型数据占32位,前4步将高16位转换成1,最后一步将低16位转换成1。