呈接 --> 【源码分析】HashMap源码探索(一) 中为什么capacity一定要是>=toSize最小的2的次幂数?
int capacity = roundUpToPowerOf2(toSize);
roundUpToPowerOf2(int number)
作用:找到>=number最接近的2的二次幂数
private static int roundUpToPowerOf2(int number) {
return number >= MAXIMUM_CAPACITY ?
MAXIMUM_CAPACITY :
(number > 1) ? Integer.highestOneBit(number-1) << 1 : 1;
}
1)Integer中的highestOneBit()方法:用来返回小于等于最接近number的2的冪数的二进制数对应的十进制数
- Tip:凡是2的次方数,这个数的的二进制位只有一个1
例如:number=5,对应的二进制为 101,highestOneBit(5)=4 (100),既在number最高位为1的位置开始,后面全部补0,最后返回4
2)Integer中的bitCount()方法:返回number二进制中1的个数
- 如果
number是2的冪数 b1=1,返回就是number, - 如果
number不是2的冪数,则highestOneBit>1,因为rounded = Integer.highestOneBit(number),rounded已经是最接近小于number的2的冪数,故rounded<<1,左移一位,成为最接近大于等于number的2的冪数了
3)案例:toSize==9,二进制==0000 1001,那么调用roundUpToPowerOf2方法逻辑:
- 找到
<=(9-1)的最小二次幂数,也即是8,然后把8左移一位,就找到了>=9的最接近的2的二次幂数16