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

删除列表元素-我在Java中获得最佳性能的方法,java,arraylist,linked-list,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.listIt

如果我需要删除列表中的元素,以下操作是否比使用
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);
    }
}
?


LinkedList
ArrayList
更有效地“删除和添加元素”,但作为双链接列表的
LinkedList
需要更多内存,因为每个元素都包装为
条目
对象。虽然我需要一个单向的
列表
界面,因为我正在按索引的升序运行。

答案是:这取决于添加和删除的频率和分布。如果您不经常只需要执行一次删除,那么您可以使用链表。然而,
ArrayList
LinkedList
上的主要杀手是恒定时间随机访问。使用普通的链表是无法做到这一点的(不过,请查看跳过列表以获得一些灵感)。相反,如果要删除相对于其他元素的元素(其中,需要删除下一个元素),则应使用链表。

对此没有简单的答案:

  • 这取决于你在优化什么。您是否更关心执行操作所需的时间或列表所使用的空间

  • 这取决于列表的长度

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

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


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

你需要定义“更好”——最重要的是速度还是内存?肯定同意@DNA,还要改进访问模式/添加/删除频率。