小编典典

遍历Collection,避免在循环中删除对象时避免ConcurrentModificationException

javascript java

我们都知道您由于以下原因而无法执行以下操作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这里使用任意值,不一定是an ArrayList,因此您不能依赖get


阅读 279

收藏
2020-09-09

共1个答案

小编典典

Iterator.remove() 是安全的,您可以这样使用它:

List<String> list = new ArrayList<>();

// This is a clever way to create the iterator and call iterator.hasNext() like
// you would do in a while-loop. It would be the same as doing:
//     Iterator<String> iterator = list.iterator();
//     while (iterator.hasNext()) {
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
    String string = iterator.next();
    if (string.isEmpty()) {
        // Remove the current element from the iterator and the list.
        iterator.remove();
    }
}

注意,这Iterator.remove()是在迭代过程中修改集合的唯一安全方法。如果在进行迭代时以任何其他方式修改了基础集合,则行为未指定。

来源:docs.oracle>收集接口

同样,如果您有个ListIterator并想要添加项目,则可以使用ListIterator#add,出于相同的原因Iterator#remove ,它可以允许使用。

你的情况,你想从列表中删除,但同样的限制,如果想put成为一个Map在迭代的内容。

2020-09-09