經常在初始化hashmap的時候出現如下情況
《阿里巴巴Java開發手冊》解釋
那么,為什么要這么建議?你有想過沒有。
我們先來寫一段代碼在JDK 下面來分別測試下,在不指定初始化容量和指定初始化容量的情況下性能情況如何。
public static void main(String[] args) {
int aHundredMillion = 10000000;
Map<Integer, Integer> map = new HashMap<>();
long s1 = System.currentTimeMillis();
for (int i = 0; i < aHundredMillion; i++) {
map.put(i, i);
}
long s2 = System.currentTimeMillis();
System.out.println("未初始化容量,耗時 : " + (s2 - s1));
Map<Integer, Integer> map1 = new HashMap<>(aHundredMillion / 2);
long s5 = System.currentTimeMillis();
for (int i = 0; i < aHundredMillion; i++) {
map1.put(i, i);
}
long s6 = System.currentTimeMillis();
System.out.println("初始化容量"+aHundredMillion / 2+",耗時 : " + (s6 - s5));
Map<Integer, Integer> map2 = new HashMap<>(aHundredMillion);
long s3 = System.currentTimeMillis();
for (int i = 0; i < aHundredMillion; i++) {
map2.put(i, i);
}
long s4 = System.currentTimeMillis();
System.out.println("初始化容量為"+aHundredMillion+",耗時 : " + (s4 - s3));
Map<Integer, Integer> map3 = new HashMap<>(16);
long s7 = System.currentTimeMillis();
for (int i = 0; i < aHundredMillion; i++) {
map3.put(i, i);
}
long s8 = System.currentTimeMillis();
System.out.println("初始化容量為16,耗時 : " + (s8 - s7));
}
運行結果
所以,如果我們沒有設置初始容量大小,隨着元素的不斷增加,HashMap會發生多次擴容,而HashMap中的擴容機制決定了每次擴容都需要重建hash表,是非常影響性能的。