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;
}