性能中的数组与ArrayList

Spa*_*ner 57 java arrays collections performance arraylist

哪一个在Object类型的Array和Object类型的ArrayList之间的性能更好?

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

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

Two*_*The 67

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

然而,现代JIT会在一定程度上对此进行优化,您很少需要担心这一点,除非您有一个性能非常关键的应用程序,并且这已被衡量为您的瓶颈.

  • 您唯一需要担心的是堆内存中的动态分配,当数组列表重新占用预先分配的内存时,它会执行:在这种情况下,JIT无法执行任何操作.有几种方法可以避免这个问题(比如使用定义的长度实例化数组列表),但许多开发人员似乎并不关心它.无论如何,好的答案:) (10认同)

Rah*_*thi 37

这里:

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


在性能方面,如果您知道索引,则Array和ArrayList在添加或获取元素的常量时间方面提供类似的性能.尽管自动调整ArrayList的大小可能会减慢插入速度但是数组和ArrayList都是Java的核心概念,任何严肃的Java程序员都必须熟悉Array和ArrayList之间或者更一般的Array vs List中的这些差异.

  • 调整大小是一个有争议的参数 - 您可以像预分配数组一样预先分配一个arraylist. (11认同)
  • 第二个环节的基准是可怕的.它通过接口声明(`List.get())`访问数组列表,已知它比类访问(`ArrayList.get()`慢).没有热身阶段.阵列很大,因此分页问题与时序结果混合在一起. (2认同)

Pau*_*tha 20

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


use*_*300 11

我同意某人最近删除的帖子,表示性能上的差异非常小,除非极少数例外情况(他因为从不说话而感到厌恶)你不应该基于此做出你的设计决定.

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

如果你正在处理一个数量的原语,阵列将提供显著更好的性能,无论是在内存和时间.


Ank*_*agi 10

数组的性能更好.ArrayList提供额外的功能,例如以性能为代价的"删除".

  • 因为它是由底层数组支持的.因此,包装数组的任何东西都不能比数组快. (6认同)