添加到列表时抛出 java.util.ConcurrentModificationException

标签 java arraylist iterator

当我运行它时,尽管我使用了 iterator.remove();

,但我得到了一个 java.util.ConcurrentModificationException

显然是我在循环中添加了数字 6。发生这种情况是否是因为迭代器“不知道”它在那里并且无论如何都无法修复它?

public static void main(String args[]){

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

    list.add("1");
    list.add("2");
    list.add("3");
    list.add("4");
    list.add("5");

    for(Iterator<String> it = list.iterator();it.hasNext();){
        String value = it.next();

        if(value.equals("4")) {
            it.remove();
            list.add("6");
        }

        System.out.println("List Value:"+value);
    }
}

最佳答案

ConcurrentModificationException 调用 String value = it.next(); 时抛出.但真正的罪魁祸首是list.add("6"); .你不能修改 Collection同时直接迭代它。您正在使用 it.remove();这很好,但不是 list.add("6"); .

虽然您可以使用 Stream 解决问题s,我将首先提供一个解决方案 Iterator s,因为这是理解问题的良好开端。

你需要一个 ListIterator<String> 如果你想在迭代期间添加和删除:

for (ListIterator<String> it = list.listIterator(); it.hasNext();){
    String value = it.next();

    if (value.equals("4")) {
        it.remove();
        it.add("6");
    }

    System.out.println("List Value: " + value);
}

这应该可以解决问题!


使用 Stream 的解决方案小号:

List<String> newList = list.stream()
        .map(s -> s.equals("4") ? "6" : s)
        .collect(Collectors.toList());

这里我们创建一个 Stream 来自你的 List .我们map所有的值(value)都是自己的,只有"4"被映射到 "6"然后我们将它收集回 List .但要小心,newList是不可变的!

关于添加到列表时抛出 java.util.ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49971932/

相关文章:

java - 对整数数组列表的数组列表进行排序

java - 设置数组中的一个元素会更改其他元素

c++ - 测试 C++ 迭代器

java - 解决不同数学运算符的优先级

java - 在 Java 应用程序中读取 XML 文件的最佳/最简单方法是什么?

java - Collections.shuffle 连续多次

java - 从列表中删除重复的键 Map.Entry

c++ - STL 迭代器上下文中的奇异值和非奇异值是什么?

python - 任何可迭代对象的值(而不是键)的通用迭代器

java - 添加Interceptor并使用Dagger2注入(inject)后Retrofit服务始终为空