时间调整具有指定容量的hashmap的大小

时间:2014-05-13 13:12:16

标签: java hashmap capacity

java doc

  

当哈希表中的条目数超过加载因子和当前容量的乘积时,哈希表将被重新哈希(即重建内部数据结构)。

我发现Time complexity for Java HashMap resizing是O(n)。

所以,我尝试了这段代码:

HashMap m = new HashMap(); // 67108864
Field tableField = HashMap.class.getDeclaredField("table");
tableField.setAccessible(true);
Object[] table = (Object[]) tableField.get(m);

double start = System.nanoTime();
for (int i = 0; i < 40000000; i++) {
    m.put(i, 2);
}
System.out.println("Time " + (System.nanoTime() - start));

案例1:HashMap m = new HashMap()(做了四次):

Time 1.8827853524E10
Time 1.8862155334E10
Time 1.9829058308E10
Time 2.1675438455E10

案例2:HashMap m =新HashMap(67108864)

Time 2.3358127475E10
Time 2.333575721E10
Time 2.3417082861E10
Time 2.3754431804E10

2例中的时间是否优于第一例?


编辑:

我只是添加了我的jvm的这个add参数:-Xms14g -Xmx17g -verbose:gc

案例1:HashMap m = new HashMap()

 Time 1.77303802E9
 Time 1.814113689E9
 Time 2.025116611E9
 Time 1.725265406E9

案例2:HashMap m =新HashMap(67108864)

 Time 1.139675599E9
 Time 1.128597762E9
 Time 1.162575164E9
 Time 1.12267688E9

所以我猜垃圾收集者做了这些时间差异,但我不知道为什么案例2在GC中花费的时间比案例1多。

0 个答案:

没有答案