Array 与 ArrayList 的性能 [重复]

Posted

技术标签:

【中文标题】Array 与 ArrayList 的性能 [重复]【英文标题】:Array vs ArrayList in performance [duplicate] 【发布时间】:2013-10-23 18:03:34 【问题描述】:

Object类型的Array和Object类型的ArrayList哪个性能更好?

假设我们有一个 Animal 对象数组:Animal animal[] 和一个数组列表:ArrayList list<Animal>

现在我正在做animal[10]list.get(10) 哪个应该更快,为什么?

【问题讨论】:

为什么这很重要?你真正想解决什么问题? 如果您只这样做几次,那么无论哪个出现在脑海中或击键次数最少的都会是最快的。您必须详细说明这个问题。 ArrayLists 由 Arrays 支持(因此得名)。几乎在所有情况下,可识别的速度差基本上为零。无论如何,有一个简单的检查方法:尝试一下 Array or List in Java. Which is faster? 的可能副本 - 基准:***.com/questions/716597/… @Kayaman 和 Ted Hopp - 这是你的测试。在这个非常基本的示例中,使用 Array 的速度提高了 300%。您可以看到,如果数组/列表更大或更复杂的操作,它将推断:pastebin.com/Gw4T1u9v 【参考方案1】:

很明显,array[10] 比 array.get(10) 更快,因为后者在内部执行相同的调用,但增加了函数调用的开销和额外的检查。

然而,现代 JIT 会在一定程度上对此进行优化,您几乎不必担心这一点,除非您有一个性能非常关键的应用程序并且这已被测量为您的瓶颈。

【讨论】:

您应该担心的唯一事情是数组列表在收到预分配内存时执行的堆内存中的动态分配:在这种情况下,JIT 无能为力。有几种方法可以避免这个问题(例如用定义的长度实例化数组列表),但许多开发人员似乎并不关心它。无论如何,很好的答案:)【参考方案2】:

来自here:

ArrayList 在 Java 中由 Array 内部支持,任何调整大小的操作 在 ArrayList 中会降低性能,因为它涉及创建新的 数组并将内容从旧数组复制到新数组。


在性能方面 Array 和 ArrayList 提供的类似 在添加或获取元素的恒定时间方面的性能,如果 你知道索引。虽然 ArrayList 的自动调整大小可能会减慢 插入一点 Array 和 ArrayList 都是 Java 的核心概念, 任何认真的 Java 程序员都必须熟悉这些差异 在 Array 和 ArrayList 或更一般的 Array 与 List 之间。

【讨论】:

调整大小是一个没有实际意义的论点 - 您可以预先分配一个数组列表,就像您必须预先分配一个数组一样。 第二个链接中的基准很糟糕。它通过接口声明访问数组列表(List.get()),已知它比类访问慢(ArrayList.get())。没有预热阶段。数组很大,因此分页问题与计时结果。 @TedHopp:- 是的,先生。那是误导!删除了那部分! :) @TedHopp 您能否提供更多详细信息/链接来解释为什么 List#get() 比 ArrayList#get() 慢 @naaz - 当运行时没有 JIT 编译器时,这主要是正确的。有关更多信息,请参阅this thread。在大多数情况下,差异基本上为零,但在这样的基准测试尝试中,效果可能不会那么容易被忽略,尤其是当 JIT 编译器(如果有)没有机会预热时。【参考方案3】:

在决定使用 Array 或 ArrayList 时,您的第一直觉真的不应该担心性能,尽管它们的性能确实不同。您首先关心的是您是否事先知道 Array 的大小。如果你不这样做,你自然会使用数组列表,只是为了功能。

【讨论】:

【参考方案4】:

数组的性能更好。 ArrayList 提供了额外的功能,例如以性能为代价的“删除”。

【讨论】:

因为它由底层数组支持。因此,任何包装数组的东西都不能比数组快。 我不认为性能会有所不同:docjar.com/html/api/java/util/ArrayList.java.html 唯一的开销是 rangeCheck。【参考方案5】:

我同意某人最近删除的帖子,即性能差异是如此之小,以至于除了极少数例外,(他因为说永远不会而被骂)你不应该基于此做出设计决定。

在您的示例中,元素是对象,性能差异应该是最小的。

如果您要处理大量基元,数组将在内存和时间上提供明显更好的性能。

【讨论】:

以上是关于Array 与 ArrayList 的性能 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将 ArrayList 转换为 Array - 不确定如何使用它 [重复]

Linkedlist与arraylist的比较[重复]

在 ArrayList 与 LinkedList 中间插入 [重复]

java中cast arraylist和cast array之间的区别[重复]

如何提高以同步方式处理多个 Arraylist 请求的性能,以将它们创建为没有重复的最终列表

什么是 List 与 ArrayList? [复制]