如何解决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 举报,一经查实,本站将立刻删除。