【源码分析】HashMap中roundUpToPowerOf2方法的原理

733 阅读1分钟

呈接 --> 【源码分析】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