CopyOnWriteArrayList
迭代器不支持remove方法。
但是为什么它在增强for循环中起作用?
List<String> lst = new CopyOnWriteArrayList<>();
lst.add("one");
lst.add("two");
lst.add("three");
for (String str : lst) {
if (str.equals("one")) {
lst.remove("two"); // no ConcurrentModificationException
}
}
System.out.println(lst); // [one, three] => removed "two" !
List<String> lst = new ArrayList<>();
将生成ConcurrentModificationException
Javadoc明确指出
CopyOnWriteArrayList.iterator()
不支持remove()
=>它应该抛出UnsupportedOperationException
!我知道它是弱一致性的-如果从CopyOnWriteArrayList获得迭代器后将元素添加到CopyOnWriteArrayList,则说没有ConcurrentModificationException
附言抱歉,我不专心-我在迭代器上未调用remove()!我被增强的内部(它隐式地使用迭代器)感到困惑。
最佳答案
CopyOnWriteArrayList迭代器的故障安全实现支持修改操作。
在CopyOnWriteArrayList和CopyOnWriteArraySet上进行迭代时,迭代器使用基础列表(或集合)的快照,并且在创建快照后不反映列表或集合的任何更改。迭代器永远不会抛出ConcurrentModificationException。
欲了解更多信息,请访问:https://markusjais.com/java-concurrency-understanding-copyonwritearraylist-and-copyonwritearrayset/
顺便说一下,在经典的List实现(如ArrayList()等)中,您无需显式使用迭代器。使用list.removeIf(predicate)方法。