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()迭代器的优缺点是什么
  • 调用时,API会在内部调用,与之类似

    对于,返回/使用
    expectedModCount
    字段与列表的
    modCount
    字段进行比较,以检查列表是否已修改

    Iterator
    的实现在创建迭代器时初始化
    expectedModCount
    字段

    Spliterator
    的实现将延迟初始化,直到从
    Spliterator
    获取第一个元素

    这意味着它允许在调用
    stream()
    和调用实际开始从流中提取数据的终端操作之间修改列表。

    这些是技术(实现)细节。更重要的方面是
    ArrayList
    stream()
    方法返回
    流。“对于行为良好的流源,可以在终端操作开始之前修改源,并且这些修改将反映在覆盖元素中。”例如…