我有以下代码抛出ConcurrentModificationException,因为我在同一个列表中使用了两个不同的迭代器,其中一个正在修改列表。因此,第二个迭代器在读取列表时抛出异常,因为其他迭代器已经修改了列表。
List<Integer> list = new ArrayList<>();
populate(list);//A method that adds integers to list
ListIterator<Integer> iterator1 = list.listIterator();
ListIterator<Integer> iterator2 = list.listIterator();
while (iterator1.hasNext()) {
if(iterator1.next() < 5)
iterator1.remove();
}
while (iterator2.hasNext()){
if(iterator2.next() < 5) {
//Call handler
}
}
我的问题是iterator2
如何知道内部 list
已被某些其他迭代器修改过,如果它尚未到达iterator1
已删除的元素{ {1}}?如何判断其他iterator
已经突变了list
?一种方法可能是跟踪大小,但这不是原因,因为其他迭代器只能替换任何元素。
答案 0 :(得分:5)
回答这样的问题的好方法是查看源代码,例如the source code for ArrayList。搜索ConcurrentModificationException
。
你应该能够说出事情是这样的:
在您的情况下,删除列表上iterator1
执行的操作会更改列表的结构操作计数(modCount
)。当要求iterator2
删除时,它会看到它的expectedModCount
,它最初收到0,与列表的当前mod计数不同。
应该注意it.remove
是一个特例。当迭代器自行删除时,其expectedModCount
会相应调整,以与基础列表保持同步。