微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java:使用foreach循环进行迭代时的并发修改异常

如何解决Java:使用foreach循环进行迭代时的并发修改异常

我知道,当您使用 forech 循环遍历数组列表,然后尝试从中删除对象时,会引发并发修改异常。 我有以下代码,每当我尝试删除任何列表的对象时都会产生此异常......除了对象“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);
    

解决方法

来自 ArrayList 文档:

该类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:如果在迭代器创建后的任何时间对列表进行结构修改,除了通过迭代器自己的 remove 或 add 方法之外的任何方式,迭代器都会抛出一个并发修改异常。因此,面对并发修改,迭代器快速而干净地失败,而不是冒着在未来不确定的时间出现任意、非确定性行为的风险。

请注意,无法保证迭代器的快速失败行为,因为一般而言,在存在非同步并发修改的情况下不可能做出任何硬性保证。快速失败的迭代器会在尽力而为的基础上抛出 ConcurrentModificationException。 因此,编写一个依赖此异常来确保其正确性的程序是错误的:迭代器的快速失败行为应该仅用于检测错误.

Iterator 上的 ArrayList 实现会在可以轻松检测到时尝试抛出 ConcurrentModification。在这种特殊情况下,这很难,因为 hasNext() 只返回 false,因此不会在迭代器上调用其他方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。