Q-R*_*IUS -1 java collections exception concurrentmodification listiterator
我有以下代码抛出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
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果它还没有到达一个尚未被删除的元素,那么内部如何iterator2知道has已被其他迭代器修改过?怎么弄清楚其他一些人已经改变了?一种方法可能是跟踪大小,但这不是原因,因为其他迭代器可以只替换任何元素.listiterator1iteratorlist
回答这样的问题的一个好方法是查看源代码,例如ArrayList的源代码.搜索ConcurrentModificationException.
你应该能够告诉事情是这样的:
在您的情况下,删除iterator1列表上执行的操作会更改列表的结构操作count(modCount).当iterator2要求删除时,它看到它expectedModCount最初收到的为0,与列表的当前mod计数不同.
应该指出的it.remove是一个特例.当迭代器自行删除时,它会expectedModCount相应地调整,以与基础列表保持同步.
| 归档时间: |
|
| 查看次数: |
369 次 |
| 最近记录: |