哪个更快——在数组末尾插入元素还是在链表中?
我猜你说“数组”时可能是指ArrayList
,因为在Java中,你不能往已满的数组里“添加”。
首先,如果你要“在结尾插入”,实际上你是在结尾追加,而不是“插入”。这一区别很重要,因为在ArrayList的任意位置执行“插入”操作的时间复杂度是O(n),因为必须将右侧的所有元素都“移动”一位以留出插入元素的位置。
向(双向)LinkedList
添加始终是一个O(1)(常数时间)操作。
向ArrayList添加通常是一个O(1)操作,但如果支撑数组已满,则可能是一个O(n)操作,因为必须分配新数组并复制每个元素。在数组未满的一般情况下,ArrayList的性能比LinkedList(稍微)快,但差距非常小。
它们的平摊成本相同,但如果需要每次都是恒定时间,只有LinkedList可以做到。
>=
数组长度或<0
时会导致IndexOutOfBoundsException
异常,否则时间复杂度为O(1)。 - Lew BlochArray
的末尾比将元素添加到LinkedList
中更快,因为将元素添加到LinkedList
中始终意味着在列表末尾创建一个单元格,然后向其中添加值。在数组中,您只需向现有单元格添加值即可。但是,在Array
中,如果已满且没有空间,则会出现IndexOutOfBoundsException
,而在LinkedList
中,您永远不会遇到此问题,因为列表将根据您的需求不断增长。此外,LinkedList
和ArrayList
之间存在明显的区别,ArrayList
具有随机访问功能,这意味着对任何元素的访问始终为O(1),而在LinkedList
中,它始终是顺序访问,这意味着访问时间将根据索引而异,并且在最坏的情况下为O(n)。但是,将元素附加到LinkedList
始终为O(1),但在ArrayList
中不是这样。如果ArrayList
未满,则为O(1),但如果已满,则首先会增加一个以上的单元格,然后才会添加该值,因此最坏的情况是O(n)。