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