CopyOnWriteArrayList-迭代器在删除元素时引发异常-for循环不

时间:2019-12-16 17:29:19

标签: java loops iterator

我试图了解CopyOnWriteArrayList。通常,根据我的理解,我们无法在for循环中删除元素,而可以在迭代器中删除(如果存在)。

public class HelloWorld {

public static void main(String arfs[]) {

    CopyOnWriteArrayList<String> copyOnWrite = new CopyOnWriteArrayList<String> ();

    copyOnWrite.add("One");
    copyOnWrite.add("Two");
    copyOnWrite.add("Three");
    copyOnWrite.add("Four");

    for(int i=0; i<copyOnWrite.size(); i++) {
        copyOnWrite.remove(i);
    }
 }

}

为什么这不会引发异常,因为我正在尝试从CopyOnWriteArrayList中删除一个元素...

Iterator<String> itr = copyOnWrite.iterator();

    while(itr.hasNext()) {
        itr.remove();
    }

但是当使用Iterator时,它会引发异常。通常,这应该是对的...

2 个答案:

答案 0 :(得分:2)

有关该集合的迭代器的文档

  

迭代器不支持remove方法。

请参阅https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CopyOnWriteArrayList.html#iterator()

通常,您对ArrayList的期望是正确的-在这种情况下,从已增强的FOR循环中删除项目将引发ConcurrentModificationException,而使用迭代器则不会,但这是不同的实现-因此行为不同。

答案 1 :(得分:0)

否,迭代器不应该通过javadoc进行更改

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CopyOnWriteArrayList.html

“不支持对迭代器本身进行元素更改操作(删除,设置和添加。这些方法将引发UnsupportedOperationException。”

在第一种情况下,它必须在突变时复制列表,这是CopyOnWriteArrayList的预期行为。