Java ConcurrentModificationException未一致抛出
在本例中,使用Java ConcurrentModificationException未一致抛出,java,iterator,Java,Iterator,在本例中,使用list.remove((Object)93)会导致ConcurrentModificationException: List<Integer> list = new ArrayList<>(); list.add(1); list.add(14); list.add(2); list.add(44); list.add(41); list.add(93); list.add(20); for(Iterator<Integer> it = li
list.remove((Object)93)
会导致ConcurrentModificationException
:
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(14);
list.add(2);
list.add(44);
list.add(41);
list.add(93);
list.add(20);
for(Iterator<Integer> it = list.iterator();it.hasNext();) {
list.remove((Object)93);
it.next();
}
System.out.println(list);
在第一个示例中,您在第一次迭代时获得了
ConcurrentModificationException
,这是预期的,因为您在使用迭代器进行迭代时修改了列表
在从ArrayList
中删除93
后的第二个示例中,甚至不会调用it.next()
,因为hasNext
将返回false-请参阅ArrayList.Itr::hasNext
的实现:
public boolean hasNext() {
return this.cursor != ArrayList.this.size;
}
它仅检查ArrayList
大小是否与光标不同。在您的示例中,93
元素位于最后一个位置。删除93
元素后,大小将减小一,因此它。next()
将计算为false
和它。next
将不被调用,也不会引发异常
这是一个巧合,您将
93
放在最后一个位置之前的位置,因此您没有收到异常。尝试在93
之后向ArrayList
添加另一个值,然后会像第一个示例一样抛出ConcurrentModificationException
。我不认为这是重复的,至少与链接的问题不一样。此问题专门讨论在迭代列表时使用list.remove()
删除项,而不是使用it.remove()
。
public boolean hasNext() {
return this.cursor != ArrayList.this.size;
}