為什么要設置HashMap的初始化容量


經常在初始化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表,是非常影響性能的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM