gpt4 book ai didi

java - ConcurrentModificationException 未一致抛出

转载 作者:行者123 更新时间:2023-12-03 18:11:51 26 4
gpt4 key购买 nike

在本例中使用 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);

但是,当我将 list.remove((Object)93) 包装在 if 语句中时,它不会导致任何错误。为什么?
for(Iterator<Integer> it = list.iterator();it.hasNext();) {
int num = it.next();
if(num == 93) {
list.remove((Object)93);
}
}
System.out.println(list);

最佳答案

在第一个示例中,您在第一次迭代时获得 ConcurrentModificationException,这是意料之中的,因为您在使用迭代器进行迭代时修改了列表。

在从 93 中删除 ArrayList 后的第二个示例中,甚至不会调用 it.next() 因为 hasNext 将返回 false - 请参阅 ArrayList.Itr::hasNext 的实现:

public boolean hasNext() {
return this.cursor != ArrayList.this.size;
}

它只检查 ArrayList 大小是否与游标不同。在您的示例中, 93 元素放置在最后一个位置。删除 93 元素后,大小将减少 1,因此 it.next() 将评估为 false 并且不会调用 it.next 并且不会引发异常。

巧合的是,您将 93 放在最后一个位置之前的位置,因此您没有收到异常。尝试在 ArrayList 之后向 93 添加另一个值,并且 ConcurrentModificationException 将像第一个示例一样被抛出。

关于java - ConcurrentModificationException 未一致抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59359331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com