gpt4 book ai didi

java 列表 java.util.ConcurrentModificationException

转载 作者:行者123 更新时间:2023-11-30 07:38:53 25 4
gpt4 key购买 nike

我的代码很平静。
我知道这一定会给我 ConcurrentModificationException
我必须使用迭代器或克隆列表或仅使用 for 循环。

问题是这段代码运行没有问题,并且 ls.remove 可以在 0-2 之间的任何索引处工作。
现在如果我将s.equals("two")更改为s.equals("one")或列表中除“two”之外的任何其他内容”
我总是会按预期得到 ConcurrentModificationException 。

另外,如果我取消注释 ls.add("four") 行,无论 s.equals() 是什么,我都将始终遇到 ConcurrentModificationException。

而且我的问题是为什么会发生这种情况以及为什么下面的代码运行良好而没有 ConcurrentModificationException 仅适用于 s.equals("two") ?

import java.util.*;
import java.util.List;

public class Test {

public static void main(String args[]) {

List<String> ls = new ArrayList<>();

ls.add("one");
ls.add("two");
ls.add("three");
//ls.add("four");

for(String s : ls) {
if(s.equals("two")) {
ls.remove(0);
//ls.remove("three");
}
}

System.out.println(ls.size());

}

}

和输出

Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at Test.main(Test.java:15)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl. java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

最佳答案

在迭代列表时不得修改列表。迭代器可能(也可能不会)失败,具体取决于实现。因此,删除部分列表中的某些元素可能有效,而其他元素则可能无效。避免此问题的保存方法是使用迭代器删除方法,或使用 CopyOnWriteArrayList 或任何其他支持此类修改的集合。

关于java 列表 java.util.ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34966167/

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