在循环集合时避免ConcurrentModificationException异常,删除对象的迭代

1297

我们都知道由于 ConcurrentModificationException,您不能执行以下操作:

for (Object i : l) {
    if (condition(i)) {
        l.remove(i);
    }
}

但这似乎有时有效,但并非总是如此。以下是一些特定代码:

public static void main(String[] args) {
    Collection<Integer> l = new ArrayList<>();

    for (int i = 0; i < 10; ++i) {
        l.add(4);
        l.add(5);
        l.add(6);
    }

    for (int i : l) {
        if (i == 5) {
            l.remove(i);
        }
    }

    System.out.println(l);
}

当然,这会导致:

Exception in thread "main" java.util.ConcurrentModificationException

虽然有多个线程,但这些线程并没有处理它。不管怎样。

如何解决此问题?如何在循环中从集合中删除一个项而不抛出异常?

我在这里还使用了一个任意的Collection,不一定是ArrayList,因此不能依赖于get方法。


1
读者注意:请阅读http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html,它可能有更简单的方法来实现您想要做的事情。 - GKFX
31个回答

-3

这可能不是最好的方法,但对于大多数小情况来说,这应该是可以接受的:

"创建第二个空数组,仅添加您想要保留的元素"

我不记得我在哪里读到的...为了公正,我将把它变成维基,希望有人能找到它或者只是为了不获得我不应得的声望。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接