我试图了解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时,它会引发异常。通常,这应该是对的...
答案 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的预期行为。