java - 迭代并从 ArrayList 中删除元素时如何避免 java.util.ConcurrentModificationException

标签 java arraylist foreach

我有一个要迭代的 ArrayList。在迭代它时,我必须同时删除元素。显然这会抛出 java.util.ConcurrentModificationException.

处理此问题的最佳做法是什么?我应该先克隆列表吗?

我删除的不是循环本身的元素,而是代码的另一部分。

我的代码如下所示:

public class Test() {
    private ArrayList<A> abc = new ArrayList<A>();

    public void doStuff() {
        for (A a : abc) 
        a.doSomething();
    }

    public void removeA(A a) {
        abc.remove(a);
    }
}

a.doSomething 可能会调用 Test.removeA();

最佳答案

两种选择:

  • 创建要删除的值列表,添加到循环中的该列表,然后在最后调用 originalList.removeAll(valuesToRemove)
  • 在迭代器本身上使用 remove() 方法。请注意,这意味着您不能使用增强的 for 循环。

作为第二个选项的示例,从列表中删除任何长度大于 5 的字符串:

List<String> list = new ArrayList<String>();
...
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
    String value = iterator.next();
    if (value.length() > 5) {
        iterator.remove();
    }
}

关于java - 迭代并从 ArrayList 中删除元素时如何避免 java.util.ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8104692/

相关文章:

java - 仅具有局部变量的实例方法的线程安全

java - Dagger 2 组件不生成用于构建的 Dagger 前缀类

java - Scala 和 Java 中的 RoundingMode.HALF_UP 区别

java - 在 Java 中对 Pair<String,Integer> 进行排序

java - 无法解析方法 setOnChildClickListener

javascript - 返回函数的值而不是 Array.forEach 中的内部函数

java - 命令行编译时无法使用包函数

VB.net 按对象名称排序 Arraylist

vb.net - 如何为数据集表中的每一行做一个?

javascript - polymer JS : How to Update all Items in an Array with set() and a forEach loop properly