for-each循环不抛出ConcurrentModificationException

时间:2017-06-28 17:52:09

标签: java

我有一个迭代列表并删除对象的方法。

public void iterateAndRemove(List<String> l) {
    for (String s : l) {
        l.remove(s); //should throw exception
    }
}

理想情况下,这应该抛出异常,因为我没有使用Iterator

但它运作正常。我的理解错了吗?

1 个答案:

答案 0 :(得分:0)

众所周知的概念是,通过Iterator删除是一种自动防范的机制。

for-each 循环可用于从列表中删除项目,因为javac在内部生成使用Iterator的代码,重复调用hasNextnext方法。 / p>

此外,即使for-each抛出并发修改异常,程序也不一定会抛出异常,所以你不能依赖于一些测试运行。

但是你必须注意到单线程环境也是如此。对于多线程环境,您必须锁定一个对象,以便程序不会抛出异常。