1. 程式人生 > 實用技巧 >HashMap之為什麼陣列初始化大小都是2的次方?

HashMap之為什麼陣列初始化大小都是2的次方?

1、為什麼hashmap的陣列初始化大小都是2的次方大小時,hashmap的效率最高?  

    /**
     * The default initial capacity - MUST be a power of two.
     */
    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
    final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                   boolean evict) {
        Node
<K,V>[] tab; Node<K,V> p; int n, i; if ((tab = table) == null || (n = tab.length) == 0) n = (tab = resize()).length; if ((p = tab[i = (n - 1) & hash]) == null) tab[i] = newNode(hash, key, value, null); ... 程式碼省略 }

執行put操作時,先通過i = (n - 1) & hash獲取插入陣列的座標,n即上面的DEFAULT_INITIAL_CAPACITY,該屬性的註釋指出必須時2的次方大小,歪?

en

1.1、首先了解以下&運算 

運算規則:0&0=0;0&1=0;1&0=0;1&1=1;

即:兩位同時為“1”,結果才為“1”,否則為0

1.2、如果DEFAULT_INITIAL_CAPACITY不為2的次方?

  假如DEFAULT_INITIAL_CAPACITY為15,那麼(n - 1) & hash 就變成了 14 & hash 即 01110 & hash,因為01110的尾數為0,那麼01110 & hash 不可能出現尾數為1的情況,導致table上尾數為1的位置不能存放元素,空間浪費大,使用的位置比陣列長度小很多,導致碰撞的機率增大,所以hashmap的初始化大小都是2的次方。