为什么阿里巴巴建议集合初始化时,指定集合容量大小?

作者:媒体转发 时间:2019-04-15 16:47

字号

集合是Java开发日常开发中经常会使用到的。在之前的一些文章中,我们介绍过一些关于使用集合类应该注意的事项,如《为什么阿里巴巴禁止在 foreach 循环里进行元素的 remove/add 操作》。

为什么阿里巴巴建议集合初始化时,指定集合容量大小?

关于集合类,《阿里巴巴Java开发手册》中其实还有另外一个规定:

为什么阿里巴巴建议集合初始化时,指定集合容量大小?

本文就来分析一下为什么会有如此建议?如果一定要设置初始容量的话,设置多少比较合适?

1.为什么要设置初始容量

我们先来写一段代码在JDK 1.7 (jdk1.7.0_79)下面来分别测试下,在不指定初始化容量和指定初始化容量的情况下性能情况如何。(jdk 8 结果会有所不同,我会在后面的文章中分析)

public static void main(String[] args) { 

    int aHundredMillion = 10000000; 

 

    Map<IntegerInteger> 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<IntegerInteger> 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("初始化容量5000000,耗时 : "+ (s6 - s5)); 

 

 

    Map<IntegerInteger> 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("初始化容量为10000000,耗时 : "+ (s4 - s3)); 

以上代码不难理解,我们创建了3个HashMap,分别使用默认的容量(16)、使用元素个数的一半(5千万)作为初始容量、使用元素个数(一亿)作为初始容量进行初始化。然后分别向其中put一亿个KV。

输出结果:

未初始化容量,耗时 :14419 

初始化容量5000000,耗时 :11916 

初始化容量为10000000,耗时 :7984 

从结果中,我们可以知道,在已知HashMap中将要存放的KV个数的时候,设置一个合理的初始化容量可以有效的提高性能。

当然,以上结论也是有理论支撑的。我们HashMap中傻傻分不清楚的那些概念文章介绍过,HashMap有扩容机制,就是当达到扩容条件时会进行扩容。HashMap的扩容条件就是当HashMap中的元素个数(size)超过临界值(threshold)时就会自动扩容。在HashMap中, threshold = loadFactor * capacity。

责任编辑:CQITer新闻报料:400-888-8888   本站原创,未经授权不得转载
继续阅读
热新闻
推荐
关于我们联系我们免责声明隐私政策 友情链接