HashMap的長度為什麼要是2的N次方

2021-10-03 03:49:35 字數 895 閱讀 5338

先貼一段原始碼壓壓驚,

/**

* the default initial capacity - must be a power of two.

*/static final int default_initial_capacity = 1 << 4; // aka 16

見上面的原始碼中的注釋,must be a power of two

我們知道hashmap是由陣列和鍊錶組成的,在put進去乙個值時,會先hashcode%tablelength,

而在計算機中位移運算是最快的,a%b=a-(a/b)*b;而a%b=a&(b-1)的前提是b必須是2的n次冪。

見原始碼

final v putval(int hash, k key, v value, boolean onlyifabsent,

boolean evict)

if (e.hash == hash &&

((k = e.key) == key || (key != null && key.equals(k))))

break;

p = e;}}

v oldvalue = e.value;

if (!onlyifabsent || oldvalue == null)

e.value = value;

afternodeaccess(e);

return oldvalue;}}

++modcount;

if (++size > threshold)

resize();

afternodeinsertion(evict);

return null;

}

其中i=(n-1)&hash就是上面介紹的原理.

HashMap的長度為什麼要是2的n次方

hashmap訪問時,都需要計算當前key應該對應entry陣列哪個元素,即計算陣列下標 演算法如下 returns index for hash code h.staticintindexfor inth,intlength returnh length 1 hashmap為了訪問高效,要盡量較少...

HashMap的長度為什麼要是2的n次方

hashmap訪問時,都需要計算當前key應該對應entry陣列哪個元素,即計算陣列下標 演算法如下 returns index for hash code h.staticintindexfor inth,intlength returnh length 1 hashmap為了訪問高效,要盡量較少...

HashMap 的長度為什麼是2的冪次方

為了能讓 hashmap 訪問高效,盡量較少碰撞,也就是要盡量把資料分配均勻。我們上面也講到了過了,hash 值的範圍值 2147483648到2147483647,前後加起來大概40億的對映空間,只要雜湊函式對映得比較均勻鬆散,一般應用是很難出現碰撞的。但問題是乙個40億長度的陣列,記憶體是放不下...