先貼一段原始碼壓壓驚,
/**
* 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億長度的陣列,記憶體是放不下...