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)方法。

09-04 14:22
查看更多