从ArrayList中删除元素的哪种方式更有效?

Geo*_*ert 4 java arraylist

我有以下声明:

ArrayList<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("2");
list.add("3");
list.add("4");
Run Code Online (Sandbox Code Playgroud)

现在我的问题是:如果我想从列表中删除"2",哪种方式更好?

第一种方式:

for(int i = 0; i < list.size(); i++) {
    if(list.get(i).equals("2")) {
        list.remove(i);
        i--;
    }
}
Run Code Online (Sandbox Code Playgroud)

第二种方式:

Iterator<String> iterator = list.iterator();
    while(iterator.hasNext())
        if(iterator.next().equals("2"))
            iterator.remove();
Run Code Online (Sandbox Code Playgroud)

两者都安全正确,哪个更有效?

是否还有其他方法可以从ArrayList中删除元素而不会IndexOutOfBounds出现错误?

tru*_*ity 5

实际上,可能更快的是

list.removeAll(Collections.singleton("2"));
Run Code Online (Sandbox Code Playgroud)

在幕后,对于一个ArrayList,它确实基本上创建了像@Edmund建议的阵列的新副本,但在较低的水平,这可能会导致更高的性能.

尽管如此,正如其他人所提到的,LinkedList从大型列表中删除多个元素通常具有更好的性能.

(即使您决定切换到a LinkedList仍然可以使用上面的代码,它将等同于使用迭代器方法,对于创建的单例集合以及发生的一些额外方法调用会产生一些开销.)


Mak*_*oto 0

对于单个元素,您的 for 循环将正常工作(好吧,当您删除时i--,它会remove()自动将元素移至左侧)(不,真的,它会正常工作)。你的迭代方法也是如此。

您只是迭代到 的末尾ArrayList,并且不会退出它。就效率而言,这是一次洗礼 - 我建议您对大小为 100,000 的运行时间进行采样,看看效果如何。(无论列表有多大,它仍然是 O(N) 操作的顺序。)