0

java 文档中:

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

我发现Java HashMap 调整大小的时间复杂度是 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 = new 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 = new HashMap(67108864)

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

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

4

0 回答 0