关于java:哪个更快 – 在数组末尾或链表中插入元素

Which is faster - inserting an element at the end of an array or a linked list

哪个更快 - 在数组或链表的末尾插入一个元素?


当你说"数组"时我假设你的意思是ArrayList,因为在Java中你不能"添加"到一个完整的数组。

首先,如果你"插入到最后",你实际上是在追尾,而不是"插入"。这种区别很重要,因为在任意位置插入ArrayList是O(n)操作,因为右边的所有元素必须沿着一个位置"移位",以便为插入的元素腾出空间。

添加到LinkedList的(尾部)始终是O(1)(恒定时间)操作。

添加到ArrayList通常是O(1)操作,但如果后备阵列已满,则可能是O(n)操作,因为必须分配新数组并复制每个元素。在数组未满的一般情况下,ArrayList的性能(稍微)比LinkedList快,但差异非常小。

两者的摊销成本是相同的,但如果每次都需要恒定时间,则只有LinkedList才能这样做。


将元素附加到Array的末尾会比添加到LinkedList更快,因为添加到LinkedList始终意味着在列表末尾创建单元格,然后向其添加值。在Array中,您只需向现有单元格添加值。但是,在Array中,如果它已经已满并且没有空格,则在LinkedList中将获得IndexOutOfBoundsException,您将永远不会遇到此问题,因为List将始终根据您的需要增长。此外,LinkedListArrayList之间存在明显差异,ArrayList存在随机访问,这意味着对任何元素的访问始终为O(1),而在LinkedList中,它始终是顺序访问,这意味着访问时间将根据索引而不同,在最坏的情况下,情况是O(n)。但是,附加到LinkedList总是O(1)但在ArrayList中不是这样。如果没有填充ArrayList,它将是O(1)但如果它已满,它将首先增加多个单元格并且仅十,它会添加值,所以最坏的情况是O(n)