效率方面,在添加到第一个索引时,制作ArrayList或使用数组会更快吗?

时间:2013-12-13 10:51:11

标签: java arrays

我正在使用Java。我想添加到数组的开头。将所有变量向上移动到数组中的一个空间,将新变量的一个位置添加到索引0中,或仅使用ArrayList会更有效吗?

我知道ArrayList会为我移动值,但我听说它们效率很低,这是真的吗?

是否有其他API可以有效地完成此任务?

5 个答案:

答案 0 :(得分:2)

两者都没有效率,因为开头的每个插入都需要移动到目前为止添加的内容。这意味着插入N元素需要O(N 2 )时间,这是相当低效的。

当您需要在列表的开头插入时,

LinkedList<T>更好。但是,它们具有内存开销,并且不允许基于索引进行快速查找。

如果在插入所有元素之前不需要使用列表,最好在列表后面插入元素,然后在开始使用之前反转列表。

答案 1 :(得分:2)

除了方法调用开销和一些小的维护成本之外,ArrayList并不比自己复制数组元素更低效。通过允许列表从支持数组中的其他位置开始而不是在索引0处,ArrayList的某些实现甚至可以更快地移动数据,如ArrayDeque所做的那样。

答案 2 :(得分:0)

ArrayList还在内部使用Arrays来存储数据。但是,Sun / Oracle添加了一个最快的算法来在索引0中添加项目并从索引1开始移动项目。因此,最好使用ArrayList进行更简单的编码,但是如果你可以调整更好的算法,那么请选择Array。 / p>

答案 3 :(得分:0)

如果要添加第一个非常频繁的索引,它将非常昂贵,因为它需要将所有索引从1重新定位到数组的末尾,即它将自己调整大小以调整顶部的新元素。 LinkedLists在这种情况下提供更好的性能,但它们不实现随机访问行为。

答案 4 :(得分:0)

ArrayList为正常使用提供足够的性能,更重要的是 - 它们是安全的。所以你不必担心越界,空指针等。

为了让它“更快”,你可以,例如,摆脱ArrayList的检查容量等,但是你正在使你的代码不安全,这意味着你必须确保您正在设置正确的参数,因为如果不是,您将获得IndexOutOfBounds等。

您可以阅读有关Trove - using primitive collections for performance非常有趣的帖子,以获取更多信息。

但是100次中有99次没有真正的需要。记住并重复我:

  

过早优化是万恶之源。

此外,我真的建议您自己查看JDK源代码。你可以学到很多东西,很明显,看看它是如何制作的。