删除列表元素 - 我在Java中获得最佳性能的方法

时间:2012-09-29 22:50:33

标签: java arraylist linked-list

如果我需要删除列表中的元素,则以下内容优于使用LinkedList

int j = 0;
List list = new ArrayList(1000000);
...
// fill in the list code here
...
for (Iterator i = list.listIterator(); i.hasNext(); j++) {
    if (checkCondition) {
        i.remove();
        i = list.listIterator(j);
    }
}

LinkedListArrayList更有效地“删除和添加元素”,但LinkedList作为双向链接列表需要更多内存,因为每个元素都被包装为{{1}对象。虽然我需要一个单向Entry接口,因为我按索引的升序运行。

2 个答案:

答案 0 :(得分:2)

答案是:它取决于添加和删除的频率和分布。如果您不必经常删除单个,则可以使用链接列表。但是,ArrayListLinkedList杀手是{{1}}的恒定时间随机访问。你不能用普通的链表真正做到这一点(但是,请查看跳过列表以获得一些灵感......)。相反,如果您要将元素 relative 删除到其他元素(其中,您需要删除下一个元素),那么您应该使用链接列表。

答案 1 :(得分:0)

对此没有简单的答案:

  • 这取决于您的优化内容。您是否关心更多关于执行操作所花费的时间或列表使用的空间?

  • 这取决于列表的长度。

  • 这取决于您从列表中删除的元素的比例。

  • 这取决于您对列表所做的其他事情。

这些决定因素中的一个或多个可能无法预先预测;即你真的不知道。所以我的建议是暂时解决这个问题;即根据直觉(或抛硬币)选择一个或另一个。如果您在此区域中存在可量化的性能问题,则可以稍后重新审视该决策...如cpu或内存使用情况分析所示。