在List 接口的 Collection 框架教程中,有一句关于从 List 实现中删除元素的性能的有趣引用:
对于许多常见的 List 实现,例如 ArrayList,从列表末尾移除元素的性能明显优于从开头移除元素的性能。
教程没有进一步解释这一点,我试图确切地理解为什么会这样。
考虑ArrayList<Integer> list
如下:
在第一种情况下,如果我们从 . 的末尾删除最后 4 个元素list
,则这些值将设置为null
(或等效)。我的理论是,当需要复制操作时,只会复制不需要的元素null
。
在第二种情况下,如果我们删除前 4 个元素,它们将被null
一次又一次地设置为,只有非null
元素会被复制。
所以从这个角度来看,表现似乎差不多。如果从最后执行,是否还有其他原因可以使操作更快?
另一方面,对于LinkedList
,倒数似乎为真;从头移除更快,而从尾移除需要几乎完全遍历,除非 atail-pointer
被保留。