在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多。