如果我使用原始数组然后重建它以添加如下所示的新元素,我想知道性能是否存在差异:
AnyClass[] elements = new AnyClass[0];
public void addElement(AnyClass e) {
AnyClass[] temp = new AnyClass[elements.length + 1];
for (int i = 0; i < elements.length; i++) {
temp[i] = elements[i];
}
temp[elements.length] = e;
elements = temp;
}
或者我只是使用 ArrayList 和添加元素。
我不确定这就是为什么我问,它是否是相同的速度,因为ArrayList的构建方式与我使用原始数组的方式相同,或者是否真的存在差异,即使基本数组总是更快我每次添加元素时都会重建它吗?
答案 0 :(得分:4)
ArrayLists以类似的方式工作,但每次达到限制时,每次将容量加倍时,不会重建。因此,如果您不断添加它,ArrayLists会更快,因为重新创建数组相当慢。 因此,如果您不经常添加内存,您的实现可以使用更少的内存,但就速度而言,它在大多数情况下都会变慢。
答案 1 :(得分:2)
当ArrayList调整大小时,它会自动翻倍,这样你就不会每次都浪费时间调整大小。摊销,这意味着它不需要任何时间来调整大小。这就是为什么你不应该浪费时间重新创建车轮。创建第一个人的人已经学会了如何使一个人更有效率并且比你更了解平台。
答案 2 :(得分:1)
简而言之,坚持使用ArrayList
。它是:
ArrayList.add()
保证为amortised constant-time,而您的方法不是{。}}。答案 3 :(得分:1)
答案 4 :(得分:0)
在速度方面,您的实施可能会明显失去Java的ArrayList
。您正在做的一件特别昂贵的事情是每次要添加元素时重新分配数组,而Java的ArrayList尝试通过在重新分配之前使用一些“缓冲区”进行优化。
答案 5 :(得分:0)
ArrayList也将使用内部Array Only,所以这是真的Array将比ArrayList更快。编写高性能代码时总是使用Array。出于同样的原因,Array是大多数集合的后骨。 您必须通过JDK实现集合。 我们在开发一些应用程序时使用ArrayList,并且我们不关心这些小的性能问题,我们做了折衷,因为我们已经编写了API来放置,获取,调整大小等。
答案 6 :(得分:0)
上下文非常重要:我的意思是如果你不断插入新的项目/元素ArrayList
肯定会比数组更快。另一方面,如果您只想访问已知位置的元素 - 比如说arrayItems[8]
,Array
比ArrayList.get(8)
更快;正常有get()
函数调用和其他步骤和检查的开销。