关于HashMap容量的初始化,还有这么多学问

作者:网友投稿 时间:2018-06-01 01:53

字号
人工智能+区块链的发展趋势及应用调研报告

在《HashMap中傻傻分不清楚的那些概念》文章中,我们介绍了HashMap中和容量相关的几个概念,简单介绍了一下HashMap的扩容机制。

关于HashMap容量的初始化,还有这么多学问

文中我们提到,默认情况下HashMap的容量是16,但是,如果用户通过构造函数指定了一个数字作为容量,那么Hash会选择大于该数字的第一个2的幂作为容量。(3->4、7->8、9->16)

本文,延续上一篇文章,我们再来深入学习下,到底应不应该设置HashMap的默认容量?如果真的要设置HashMap的初始容量,我们应该设置多少?

为什么要设置HashMap的初始化容量

我们之前提到过,《阿里巴巴Java开发手册》中建议我们设置HashMap的初始化容量。

那么,为什么要这么建议?你有想过没有。

我们先来写一段代码在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个数的时候,设置一个合理的初始化容量可以有效的提高性能。

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