写在最开始:以下方法是按照网上提供的方法测试的,很不规范(网络上提供的论证方法一定要自己试试,太不靠谱),文章结尾提供了另外一种测试方法
在《阿里巴巴Java开发手册v1.3.0》一、编程规约 – (五)集合处理 – 第九条的规范里,集合初始化时,指定集合初始值大小。因为HashMap在自动扩容时会消耗时间,网上也大多也都同意,也相应的做了很多demo证明这个理论。但是最近做了相关的demo,发现集合初始化大小,从毫秒的层面上来看并不能提升效率,以下会贴出我的demo和我的疑问,欢迎大家来指正。测试工具Eclipse、jdk8
public static void main(String[] args) {
int aHundredMillion = 1000000;
Map<Integer, Object> 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("初始化容量500000,耗时 : " + (s6 - s5));
Map<Integer, Object> map2 = new HashMap<>(aHundredMillion/3*4+1);
long s3 = System.currentTimeMillis();
for (int i = 0; i < aHundredMillion; i++) {
map2.put(i, i);
}
long s4 = System.currentTimeMillis();
System.out.println("初始化容量为标准容量,耗时 : " + (s4 - s3));
}
上面是一个很简单的demo,依次打印出:1.未初始化容量的耗时 2.初始化容量500000的耗时 3.初始化容量为标准容量的耗时(大小/3*4+1),以下结果都是多次执行,耗时结果都几乎不差多少
样本数据为1000000的结果为(顺序记为1、2、3):
未初始化容量,耗时 : 94
初始化容量500000,耗时 : 69
初始化容量为标准容量,耗时 : 24
从上面的结果可以看出初始化为标准容量耗时是最小的,网上也大多是这样的结果,但是调整顺序执行了一遍,发现了不一样的结果,同样是样本数据为1000000的结果为:
初始化容量为标准容量,耗时 : 95
初始化容量500000,耗时 : 90
未初始化容量,耗时 : 30
然而在3、2、1的顺序的情况下,未初始化容量的耗时却是最小的。
上诉的执行结果都是在以一个main方法,现在分别对着三种情况执行。
1.未初始化容量,耗时 : 102
2.初始化容量500000,耗时 : 106
3. 初始化容量为标准容量,耗时 : 100
分别对以上三种情况分别做多次执行,发现耗时时间差不多。到底为什么呢?又猜测是不是的存储数据达到一定数量会导致初始化值并不会提高效率?因为设置初始化值也得花费时间。而且验证过在一千万的情况下,分别执行:初始化大小的时间要比未初始化的时间要耗时很多
样本数据为10000的结果为(顺序记为3、2、1):
初始化容量为标准容量,耗时 : 4
初始化容量500000,耗时 : 2
未初始化容量,耗时 : 2
样本数据为10000,分别执行三种情况:
- 初始化容量为标准容量,耗时 : 2或3
2.初始化容量500000,耗时 : 2 或3
3.未初始化容量,耗时 : 2或3
样本数据为1000,执行的情况都是低于1毫秒,所有没有统计出来。
之后还使用Idea,jdk7测试过结果基本一样。最后通过实验总结了一些结果:
1.当数据量很大的情况,初始化大小会比为未初始化大小更耗时(当然实际开发中也很少有向map里放入千万的map)
2.初始化map的大小并不能提高效率,(该结论只是适用在毫秒级的,如果更精细的时间没有做验证,故此不是很严谨)
3. 在同一个方法内有多个Map,第一个map会比较好耗时,之后的map效率会高点(具体原因还没有想明白)
以上结论只是本人观点,如有错误欢迎指正,避免误导他人!
写在2019.12.10日:上面的测试方法是根据网上提供的方案测试的,发现测试结果并不科学,推荐一种测试方案:JMH基准测试,可以进行预热、多次结果取平均值等功能,想了解的可以我的另一篇文章,做的实验就是初始化hashMap效率测试:优秀的基准测试工具–JMH
未完、待续、、、、