ConcurrentModificationException

ConcurrentModificationException

为什么会这样?

我写了这段代码,它抛出 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/

10-10 19:07