通过tableSizeFor(cap)计算出不小于initialCapacity的最近的2的幂作为初始容量,将其先保存在threshold里
/**
* 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;
}
为什么移位是1,2,4,8,16这样的等比数列?
假设实参cap的二进制为01xx…xx。
对cap右移1位:01xx…xx,移位之后或:011xx…xx,使得与最高位的1紧邻的右边一位为1,
对cap再右移2位:00011x..xx,移位之后或:01111x..xx,使得从最高位的1开始的四位也为1,
以此类推,int为32位,所以在右移16位后异或最多得到32个连续的1,保证从最高位的1到末尾全部为1。
假设输入6,则得8;
假设输入10,则得16
假设输入17,则得32
假设输入33,则得64
private static final int MAXIMUM_CAPACITY = 1 << 30;
/**
<< : 左移运算符,num << 1,相当于num乘以2
>> : 右移运算符,num >> 1,相当于num除以2
>>> : 无符号右移,忽略符号位,空位都以0补齐
*/
public static void main(String[] args) {
int n=9;
/* n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;*/
n =n| n >>> 1;//1001|0100 ---->1101(13)
System.out.println("n =n| n >>> 1 : "+n);
n =n| n >>> 2;//1101|0011 ---->1111(15)
System.out.println("n =n| n >>> 2 : "+n);
n =n| n >>> 4;//1111|0000 ---->1111(15)
System.out.println("n =n| n >>> 4 : "+n);
n =n| n >>> 8;//1111|0000 ---->1111(15)
System.out.println("n =n| n >>> 8 : "+n);
n =n| n >>> 16;//1111|0000 ---->1111(15)
System.out.println("n =n| n >>> 16 : "+n);
n= (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
System.out.println(n);
}
结果为
n =n| n >>> 1 : 13
n =n| n >>> 2 : 15
n =n| n >>> 4 : 15
n =n| n >>> 8 : 15
n =n| n >>> 16 : 15
16