【问题标题】:Remove list elements - my approach for best performance in Java删除列表元素——我在 Java 中获得最佳性能的方法
【发布时间】:2012-09-29 22:50:33
【问题描述】:

如果我需要删除列表中的元素,以下是否比使用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 作为双向链表需要更多内存,因为每个元素都包装为Entry 对象。虽然我需要一个单向的List 接口,因为我是按索引升序运行的。

【问题讨论】:

  • 您需要定义“更好”——速度还是内存最重要?
  • 完全同意@DNA,同时细化访问模式/添加删除频率。

标签: java arraylist linked-list


【解决方案1】:

答案是:这取决于添加和删除的频率和分布。如果您只需要不频繁地进行一次 single 删除,那么您可以使用链表。然而,ArrayListLinkedList主要 杀手是恒定时间随机访问。你不能用普通的链表真正做到这一点(但是,请查看跳过列表以获得一些灵感......)。相反,如果您要删除元素 relative 到其他元素(其中,您需要删除下一个元素),那么您应该使用链表。

【讨论】:

    【解决方案2】:

    对此没有简单的答案:

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

    • 这取决于列表的长度。

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

    • 这取决于您对列表执行的其他操作。

    这些决定因素中的一个或多个可能无法预先预测;即你真的不知道。所以我的建议是暂时推迟它;即根据直觉(或掷硬币)选择一个或另一个。如果您在这方面有可量化的性能问题,您可以稍后重新考虑该决定……如 cpu 或内存使用情况分析所示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2018-03-13
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多