java列表java.util.ConcurrentModificationException

java列表java.util.ConcurrentModificationException,java,list,Java,List,我有这种代码的和平 我知道这必须给我ConcurrentModificationException 我必须使用迭代器,或者克隆列表,或者只使用for循环 问题是此代码运行时没有问题,ls.remove在0-2之间的任何索引上都有效。 现在如果我将s.equals(“两”)更改为s.equals(“一”)或列表中除“两”以外的任何内容 我总是会得到ConcurrentModificationException,正如预期的那样 另外,如果我取消对ls.add(“four”)行的注释,则无论s.eq

我有这种代码的和平
我知道这必须给我ConcurrentModificationException
我必须使用迭代器,或者克隆列表,或者只使用for循环

问题是此代码运行时没有问题,ls.remove在0-2之间的任何索引上都有效。
现在如果我将s.equals(“两”)更改为s.equals(“一”)或列表中除“两”以外的任何内容
我总是会得到ConcurrentModificationException,正如预期的那样

另外,如果我取消对ls.add(“four”)行的注释,则无论s.equals()是什么,我都会有ConcurrentModificationException
我的问题是为什么会发生这种情况,以及为什么下面的代码运行良好,而没有ConcurrentModificationException仅适用于s.equals(“2”)


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

在对列表进行迭代时,不能修改列表。而且
ConcurrentModificationException
不一定会发生。的重复
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)