为什么要设置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表,是非常影响性能的。

posted @ 2019-08-07 17:22  ourlang  阅读(1402)  评论(1编辑  收藏  举报