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