HashMap中一個精巧算法 tableSizeFor(int cap)


源碼如下:

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;
    }

主要功能是:返回一個大於等於且最接近 cap 的2的冪次方整數,如給定9,返回2的4次方16。

 
這個算法的大致原理: 
假定cap也就是給定數的的形式為00..01XXXXXXX,(X代表可為0也可為1,X前面的1為從最高位開始第一個為1的那一位) 
第一步: n |= n >>> 1; 也就是n變為n與n右移一位之后異或后的值,即 
n: 00..01XXXXXXX 
n>>>1: 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(2的冪次方); 

 

與此類似的方法:

while (capacity < initialCapacity){   //確保容量為2的n次冪;使capacity為大於initialCapacity的最小的2的冪次方
    capacity <<= 1;
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM