【发布时间】:2016-08-05 16:05:13
【问题描述】:
将创建大型 ArrayList 与 intialCapacity 进行比较,我发现它比没有创建大型 ArrayList 慢。这是我编写的用于测量它的简单程序:
long start2 = System.nanoTime();
List<Double> col = new ArrayList<>(30000000); // <--- Here
for (int i = 0; i < 30000000; i++) {
col.add(Math.sqrt(i + 1));
}
long end2 = System.nanoTime();
System.out.println(end2 - start2);
System.out.println(col.get(12411325).hashCode() == System.nanoTime());
新ArrayList<>(30000000)的平均结果:6121173329
新ArrayList<>()的平均结果:4883894100
在我的机器上。我认为一旦超出当前底层数组ArrayList 的容量,创建一次大型数组而不是重新创建它会更快。最终我们应该得到大于或等于30000000 的数组大小。
我以为是优化,其实是悲观。为什么会这样?
【问题讨论】:
-
@ManoDestra 那么,初始容量的用途是什么,何时使用?
-
当您添加
30,000,000th 元素时,List扩展为60,000,000元素。尝试将初始容量增加1(但不要在List中添加其他数字)。 -
@ManoDestra 如果它恰好是
forlopp 之后的列表大小,那么“高”是怎么来的?如果 OPs 的发现确实是真的,我会感到惊讶,因为如果没有设置初始容量,ArrayList 将不得不重新分配和复制自身ceil(log2(30000000/10)) = 22次,最终内部容量为41943040,超过 30%太多了。 -
@ElliottFrisch 如果你能挖掘出编写的源代码,这将是一个很好的答案!
-
如果您正在做一个小型基准测试,我建议您通读这个问题:stackoverflow.com/questions/504103/…