Java 阵列与阵列列表的性能对比

Java 阵列与阵列列表的性能对比,java,arrays,performance,collections,arraylist,Java,Arrays,Performance,Collections,Arraylist,在Object类型的数组和Object类型的ArrayList之间,哪一个性能更好 假设我们有一个Animal对象数组:Animal-Animal[]和一个arraylist:arraylist列表 现在我正在做animal[10]和list.get(10) 哪个应该更快?为什么?阵列的性能更好。ArrayList以牺牲性能为代价提供其他功能,如“删除”。来自: ArrayList在Java中由数组内部支持,任何调整大小的操作 in-ArrayList会降低性能,因为它涉及到创建新的 数组,并将

在Object类型的数组和Object类型的ArrayList之间,哪一个性能更好

假设我们有一个
Animal
对象数组:
Animal-Animal[]
和一个arraylist:
arraylist列表

现在我正在做
animal[10]
list.get(10)

哪个应该更快?为什么?

阵列的性能更好。ArrayList以牺牲性能为代价提供其他功能,如“删除”。

来自:

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


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


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

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


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

我同意某人最近删除的帖子,即性能差异非常小,除了极少数例外,(他因说“决不”而受到谴责)你不应该基于此做出设计决定

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


如果您要处理大量的原语,数组将在内存和时间方面提供显著更好的性能。

为什么这很重要?您实际要解决的问题是什么?如果您只做了几次,那么无论是想到的还是击键最少的,都将是最快的。您必须详细说明此question.ArrayLists由数组支持(因此得名)。在几乎所有情况下,速度差基本上为零。在任何情况下,都有一个简单的检查方法:试试。可能重复-基准:@Kayaman和Ted Hopp-这是您的测试。在这个非常基本的示例中,使用数组快300%。您可以看到,如果数组/列表更大,它将推断或者有更复杂的操作:因为它是由底层数组支持的。因此,任何包装数组的操作都不能比数组快。我认为性能不会有什么不同:唯一的开销是范围检查。调整大小是一个没有实际意义的参数-可以像预分配数组一样预分配arraylist。第二个链接中的基准非常糟糕。它通过接口声明(
list.get())
访问数组列表,这比类访问(
ArrayList.get()
)要慢。没有预热阶段。数组很大,因此分页问题与计时结果混合在一起。@TedHopp:-是的,先生。这是误导性的!删除了那部分!:)@TedHopp你能提供更多详细信息/链接来解释为什么List#get()比ArrayList#get()@naaz慢-当运行时没有JIT编译器时,这基本上是正确的。有关更多信息,请参阅。在大多数情况下,差异基本上为零,但在这样的基准测试尝试中,效果可能不会那么容易被忽略,尤其是在JIT编译器(如果有的话)的情况下您唯一应该担心的是数组列表在到达预先分配的内存时在堆内存中执行的动态分配:在这种情况下,JIT无能为力。有几种方法可以避免这个问题(比如用定义的长度实例化数组列表),但许多开发人员似乎并不关心这个问题。无论如何,好答案:)