【发布时间】:2013-03-12 02:07:07
【问题描述】:
在 List interface 的 Collection 框架教程中,有一句关于从 List 实现中删除元素的性能的有趣引用:
对于许多常见的 List 实现,例如 ArrayList,从列表末尾移除元素的性能大大优于从开头移除元素。
教程没有进一步解释这一点,我试图准确理解为什么会这样。
考虑如下ArrayList<Integer> list:
在第一种情况下,如果我们从 list 的末尾删除最后 4 个元素,那么这些值将设置为 null(或等效项)。我的理论是,当需要进行复制操作时,只会复制不是null 的元素。
在第二种情况下,如果我们删除前 4 个元素,它们将被设置为null,并且只会复制非null 元素。
所以从这个角度来看,表演似乎大致相同。如果从头开始执行,是否还有其他原因导致操作更快?
另一方面,对于LinkedList,情况正好相反;从头删除更快,而从末尾删除需要几乎完全遍历,除非tail-pointer
保留。
【问题讨论】:
标签: java performance list