【问题标题】:CopyOnWriteArrayList - Iterator throw exceptions when removing element - for loop doesn'tCopyOnWriteArrayList - 删除元素时迭代器抛出异常 - for 循环不会
【发布时间】:2019-12-16 17:29:19
【问题描述】:

我想了解 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 时它会抛出一个异常......通常这应该是相反的权利......

【问题讨论】:

  • 什么异常?

标签: java loops iterator


【解决方案1】:

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

迭代器不支持 remove 方法。

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

通常你的期望是正确的,例如 ArrayList - 在增强的 FOR 循环中删除项目会抛出 ConcurrentModificationException 而使用迭代器不会,但这是不同的实现 - 因此不同的行为。

【讨论】:

    【解决方案2】:

    不,迭代器不应该进行突变,来自 javadoc

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

    “不支持对迭代器本身的元素更改操作(删除、设置和添加)。这些方法抛出 UnsupportedOperationException。”

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

    【讨论】:

    • 这就是为什么我问他得到什么样的例外。
    猜你喜欢
    • 2011-05-07
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 2020-05-20
    • 2018-01-27
    • 1970-01-01
    相关资源
    最近更新 更多