1. 程式人生 > 其它 >jdk8 hashmap tableSizeFor的理解

jdk8 hashmap tableSizeFor的理解

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

程式碼是這樣子,效果是為了獲取一個2的指數大小的目標大小。

這裡運算有一個重要的概念:

2進位制的數,如果任意位都為1,如:111111,這樣的數 +1後,會變成:1000000,而這個數必為2的指數。

所以,這個方法設計的時候,首先要考慮的是得到一個1111111這樣的數,然後要加1。

然後還有一點,加入cap這個傳進來的容量,就是一個2的指數呢?

這個時候,比如,傳入的是2,結果會得到4,傳入4,得到8,這樣子就造成浪費,也與使用者的意圖不符。

>>> 代表無符號右移,在正數的時候和>>是一樣的。