java.util.ConcurrentModificationException不清楚

java.util.ConcurrentModificationException不清楚,java,Java,为什么会这样? 我已经编写了这段代码,它抛出java.util.ConcurrentModificationException List<Integer> list = Stream.iterate(0, t -> t + 1).limit(10).collect(Collectors.toList()); System.out.println(list); List<Integer> subList = list.subList(5, list.size());

为什么会这样?

我已经编写了这段代码,它抛出java.util.ConcurrentModificationException

List<Integer> list = Stream.iterate(0, t -> t + 1).limit(10).collect(Collectors.toList());
System.out.println(list);
List<Integer> subList = list.subList(5, list.size());
list.removeAll(subList);
System.out.println(subList);
System.out.println(list);
List List=Stream.iterate(0,t->t+1).limit(10).collect(Collectors.toList());
系统输出打印项次(列表);
List subList=List.subList(5,List.size());
list.removeAll(子列表);
System.out.println(子列表);
系统输出打印项次(列表);
但下一个代码不会抛出

List<Integer> list = Stream.iterate(0, t -> t + 1).limit(10).collect(Collectors.toList());
System.out.println(list);
List<Integer> subList = list.subList(5, list.size());
System.out.println(subList);
list.removeAll(subList);
System.out.println(list);
List List=Stream.iterate(0,t->t+1).limit(10).collect(Collectors.toList());
系统输出打印项次(列表);
List subList=List.subList(5,List.size());
System.out.println(子列表);
list.removeAll(子列表);
系统输出打印项次(列表);

查看Javadoc中的方法,它清楚地指出:

如果 支持列表(即此列表)在结构上以任何方式进行修改 而不是通过返回的列表

在第一个示例中,情况正是这样:通过调用
removeAll()
,在结构上修改了支持列表,因此子列表的行为现在未指定

打印列表的后续调用最终抛出了一个
ConcurrentModificationException
,这只是一个实现细节

如果要避免这种情况,必须从检索的子列表创建一个新列表,即

List<Integer> subList = new ArrayList<>(list.subList(5, list.size()));
list.removeAll(subList);
List subList=newarraylist(List.subList(5,List.size());
list.removeAll(子列表);
这两个列表现在都可以独立访问和修改。

谢谢

下一个代码将修复

    List<Integer> subList = new ArrayList<>(list.subList(5, list.size()));
List subList=newarraylist(List.subList(5,List.size());

不创建新列表,使用
CopyOnWriteArrayList
怎么样

List<Integer> subList = new CopyOnWriteArrayList<>(list.subList(5, list.size()));
List subList=newcopyonwritearraylist(List.subList(5,List.size());

@Blasanka在进行一些修改时,第一个代码段在哪里迭代?你看到了吗,唯一的区别是交换了两行,其中一行只打印出子列表?我知道列表迭代过程中的修改。但以我的方式,我有两个单线程的最终操作