java:使用foreach循环迭代时并发修改异常

r1zk6ea1  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(810)

这个问题在这里已经有答案了

java list的.remove方法只适用于每个循环中的倒数第二个对象[重复](7个答案)
四天前关门了。
我知道,当您使用forech循环遍历arraylist,然后尝试从中移除对象时,会引发并发修改异常。我有以下代码,每当我试图删除列表中的任何对象时,都会产生此异常…..除了对象“d”。每当我试图删除这个对象时,都不会抛出异常。有人能告诉我为什么没有例外吗?这是我的密码:

List<String> myList = new ArrayList<>();
        myList.add("A");
        myList.add("B");
        myList.add("C");
        myList.add("D");
        myList.add("E");

        for (String s: myList) {
            if (s.equals("D")) {
                myList.remove("D");
            }
        }
        System.out.println(myList);
iezvtpos

iezvtpos1#

ArrayList 文件:
这个类的迭代器和listiterator方法返回的迭代器是快速失败的:如果在迭代器创建之后的任何时候,以任何方式(除了通过迭代器自己的remove或add方法之外)对列表进行结构修改,迭代器将抛出concurrentmodificationexception。因此,在面对并发修改时,迭代器会快速而干净地失败,而不是冒着在将来不确定的时间出现任意的、不确定的行为的风险。
注意,不能保证迭代器的快速故障行为,因为一般来说,在存在非同步并发修改的情况下,不可能做出任何硬保证。失败的快速迭代器会尽最大努力抛出concurrentmodificationexception。因此,编写一个依赖于此异常来保证其正确性的程序是错误的:迭代器的fail-fast行为应该只用于检测bug。
这个 Iterator 实施于 ArrayList 试着扔 ConcurrentModification 当它很容易发现的时候。在这种特殊的情况下,这很难,因为 hasNext() 只返回false,因此不会在迭代器上调用其他方法。

相关问题