gpt4 book ai didi

Java:为什么在使用 Stream+Iterator 时不会发生 ConcurrentModificationException?

转载 作者:行者123 更新时间:2023-12-01 12:47:48 25 4
gpt4 key购买 nike

我正在阅读一些关于迭代器、枚举等的信息。所以我测试了一些代码来检查所有内容。
第一个例子:

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
但是当我测试相同的代码时,只有 1 处更改 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.stream().iterator();
list.remove("1");
iterator.forEachRemaining(System.out::println);
结果是:
5
2
3
我的主要目的是了解:
  • 为什么会这样?
  • 什么魔法只有一个 stream()方法?
  • 使用stream().iterator有什么优缺点?
  • 最佳答案

    当您调用 stream() ,API 内部调用 spliterator() , 它类似于 iterator() .
    对于 ArrayList , 返回 Spliterator / Iterator 使用 expectedModCount要与 modCount 进行比较的字段列表的字段,以检查列表是否已被修改。Iterator的执行初始化 expectedModCount创建迭代器时的字段。Spliterator的执行推迟初始化,直到第一个元素取自 Spliterator .
    这意味着它允许在调用 stream() 之间修改列表。以及对实际开始从流中提取数据的终端操作的调用。

    关于Java:为什么在使用 Stream+Iterator 时不会发生 ConcurrentModificationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62667144/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com