首页 > 解决方案 > 使用 Collection.remove() 时 Java ConcurrentModificationException 背后的原因

问题描述

StackOverflow 上的许多贡献提供了一个清晰的解释,说明为什么应该使用 Iterator 及其 remove 方法在迭代集合时删除集合中的元素(例如123)。

但是,当一个人使用而不是时,究竟是什么导致ConcurrentModificationException抛出?我一直在寻找详细的答案,但没有找到。甚至 The Java™ Tutorials也简单地指出:Collection.remove()Iterator.remove()

for-each 构造隐藏了迭代器,因此您不能调用 remove。

这是什么意思?这两种实现有何不同?在如下一段代码中,导致异常的事件链是什么?

Collection<String> names = new ArrayList<>();
names.add("Luke");
names.add("Leia");
names.add("Anakin");

for (String name : names) {
    if (name.equals("Anakin")) {
        names.remove(name);
    }
}

标签: javaforeachcollectionsiteratorconcurrentmodification

解决方案


推荐阅读