为什么会这样?
我写了这段代码,它抛出 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<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);
最佳答案
查看 subList()
方法的 Javadoc,它明确指出:
在您的第一个示例中,这正是正在发生的事情:您正在通过调用 removeAll()
从结构上修改支持列表,因此您的子列表的行为现在未指定。
打印列表的后续调用最终抛出 ConcurrentModificationException
的事实只是一个实现细节。
如果你想避免这种情况,你必须从你检索的子列表中创建一个新列表,即
List<Integer> subList = new ArrayList<>(list.subList(5, list.size()));
list.removeAll(subList);
现在可以独立访问和修改这两个列表。
关于java - 不清楚 java.util.ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44514394/