HashMap源码中的tableSizeFor(int cap)方法

    /**
     *返回一个比给定整数大且最接近的2的幂次方整数
     * 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;
    }

tableSizeFor(int cap)是hashMap中的一个Static函数,主要功能是返回一个比给定整数大且最接近的2的幂次方整数,如给定7,返回2的3次方8

这个算法的原理是什么呢:

|位或运算符,两个数都转为二进制,然后从高位开始比较,两个数只要有一个为1则为1,否则就为0,

我们首先假定cap也就是给定数的二进制形式为00..01XXXXXXX,(X代表可为0也可为1,X前面的1为从最高位开始第一个为1的那一位)
首先是n |= n >>> 1;也就是n变成:n与n右移一位之后做位或运算后的值,即
n的二进制:00..01XXXXXXX
n>>>1(向右移动一位,即n的原值除以2以后,获得的2进制)
:00..001XXXXXX
|(位或运算符) 或得到新n:00..011XXXXXX
也许到这里你还看不出什么结果,那接着看第二步n |= n >>> 2;也就是n变成n与n右移两位之后位或运算即
n: 00..011XXXXXX
n>>>2: 00..00011XXXX
新n: 00..01111XXXX
到这里就不用再解释了吧,这个算法不断的通过把第一个1开始后面的位变成1,本例由00..01XXXXXXX->00..011111111,最后再返回n+1;

参考文章

java运算符 与(&)、非(~)、或(|)、异或(^)