HashMap之為什麼陣列初始化大小都是2的次方?
阿新 • • 發佈:2020-07-20
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的次方。