怎么在java中初始化hashmap容量

  介绍

今天就跟大家聊聊有关怎么在java中初始化hashmap容量,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

public  static  void  main (String [], args), {   ,int  aHundredMillion =, 10000000;      ,//未初始化容量   ,Map<整数,Integer>, map =, new  HashMap<在();   ,long  s1 =, System.currentTimeMillis ();   ,for  (int 小姐:=,0;,小姐:& lt;, aHundredMillion;,我+ +),{   map.put才能(我,);   ,}   ,long  s2 =, System.currentTimeMillis ();   ,System.out.println(“未初始化容量,耗时:,“,+,(s2 安康;s1));//, 14322      ,//初始化容量为50000000   ,Map<整数,Integer>, map1 =, new  HashMap<祝辞(时间/aHundredMillion  2);   ,long  s3 =, System.currentTimeMillis ();   ,for  (int 小姐:=,0;,小姐:& lt;, aHundredMillion;,我+ +),{   map1.put才能(我,);   ,}   ,long  s4 =, System.currentTimeMillis ();   ,System.out.println(“初始化容量5000000,耗时:,“,+,(s4 安康;s3));//, 11819      ,//初始化容量为100000000   ,Map<整数,Integer>, map2 =, new  HashMap<祝辞(aHundredMillion);   ,long  s5 =, System.currentTimeMillis ();   ,for  (int 小姐:=,0;,小姐:& lt;, aHundredMillion;,我+ +),{   map2.put才能(我,);   ,}   ,long  s6 =, System.currentTimeMillis ();   ,System.out.println(“初始化容量为10000000,耗时:,“,+,(s6 安康;s5));//, 7978   }

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

从上面的打印结果中可以得到一个初步的结论:在已知HashMap中将要存放的KV个数的时候,设置一个合理的初始化容量可以有效地提高性能。下面我们来简单分析一下原因。

我们知道,HashMap是有扩容机制的。所谓的扩容机制,指的是当达到扩容条件的时候,HashMap就会自动进行扩容。而HashMap的扩容条件就是当HashMap中的元素个数(大小)超过临界值(阈值)的情况下就会自动扩容。

threshold =, loadFactor  *,容量

在元素个数超过临界值的情况下,随着元素的不断增加,HashMap就会发生扩容,而HashMap中的扩容机制决定了每次扩容都需要重建哈希表,这一操作需要消耗大量资源,是非常影响性能的。因此,如果我们没有设置初始的容量大小,HashMap就可能会不断发生扩容,也就使得程序的性能降低了。

另外,在上面的代码中我们会发现,同样是设置了初始化容量,设置的数值不同也会影响性能,那么当我们已知HashMap中即将存放的KV个数的时候,容量的设置就成了一个问题。

<强> HashMap中容量的初始化

开头提到,在默认的情况下,当我们设置HashMap的初始化容量时,实际上HashMap会采用第一个大于该数值的2的幂作为初始化容量。

Map<字符串,String>, map =, new  HashMap<祝辞(1);   map.put (“huangq",,“yanggb");      Class<?祝辞,mapType =, map.getClass ();   Method  capacity =, mapType.getDeclaredMethod (“capacity");   capacity.setAccessible(真正的);   System.out.println (“capacity :,“, +, capacity.invoke(地图)),,//,2

当初始化的容量设置成1的时候,通过反射取出来的能力却是2。在JDK1.8中,如果我们传入的初始化容量为1,实际上设置的结果也是1。上面的代码打印的结果为2的原因,是代码中给地图塞入值的操作导致了扩容,容量从1扩容到了2。事实上,在JDK1.7和JDK1.8中,HashMap初始化容量(能力)的时机不同。在JDK1.8中,调用HashMap的构造函数定义HashMap的时候,就会进行容量的设定。而在JDK1.7中,要等到第一次把操作时才进行这一操作。

因此,当我们通过HashMap (int initialCapacity)设置初始容量的时候,HashMap并不一定会直接采用我们传入的数值,而是经过计算,得到一个新值,目的是提高散列的效率,比如1→1、3→4 7→8和9→16。

<强> HashMap中初始容量的合理值

通过上面的分析我们可以知道,当我们使用HashMap (int initialCapacity)来初始化容量的时候,JDK会默认帮我们计算一个相对合理的值当做初始容量。那么,是不是我们只需要把已知的HashMap中即将存放的元素个数直接传给initialCapacity就可以了呢?

怎么在java中初始化hashmap容量