Java:为什么ConcurrentModificationException在使用Stream+;迭代器?
我正在阅读一些关于迭代器、枚举等的信息,所以我测试了一些代码来检查所有内容 第一个示例:Java:为什么ConcurrentModificationException在使用Stream+;迭代器?,java,arraylist,java-8,iterator,java-stream,Java,Arraylist,Java 8,Iterator,Java Stream,我正在阅读一些关于迭代器、枚举等的信息,所以我测试了一些代码来检查所有内容 第一个示例: List<String> list = new ArrayList<>(); list.add("5"); list.add("1"); list.add("2"); list.add("3"); Iterator<String> iterator = list.iterator(); lis
List<String> list = new ArrayList<>();
list.add("5");
list.add("1");
list.add("2");
list.add("3");
Iterator<String> iterator = list.iterator();
list.remove("1");
iterator.forEachRemaining(System.out::println);
Exception in thread "main" java.util.ConcurrentModificationException
5
2
3
但是当我测试相同的代码时,只做了一个更改list.iterator()
->list.stream().iterator()
我的主要目的是了解:
List<String> list = new ArrayList<>();
list.add("5");
list.add("1");
list.add("2");
list.add("3");
Iterator<String> iterator = list.iterator();
list.remove("1");
iterator.forEachRemaining(System.out::println);
Exception in thread "main" java.util.ConcurrentModificationException
5
2
3
stream()
方法stream()迭代器的优缺点是什么
expectedModCount
字段与列表的modCount
字段进行比较,以检查列表是否已修改
Iterator
的实现在创建迭代器时初始化expectedModCount
字段
Spliterator
的实现将延迟初始化,直到从Spliterator
获取第一个元素
这意味着它允许在调用stream()
和调用实际开始从流中提取数据的终端操作之间修改列表。这些是技术(实现)细节。更重要的方面是ArrayList
的stream()
方法返回流。“对于行为良好的流源,可以在终端操作开始之前修改源,并且这些修改将反映在覆盖元素中。”例如…