java - java流在创建不可变列表时是否创建一些临时列表?

标签 java java-8 java-stream immutability

由于无法将任何元素添加到不可变列表中,因此我认为java流首先将元素收集到列表中,然后使用第一个列表中的元素创建一个新的不可变列表。因此,该列表有两个实例,第一个实例可用于垃圾回收。

所以,我的问题是

  1. stream 是否真的创建了上面提到的两个列表对象?
  2. 如果没有,stream 如何创建不可变列表?

最佳答案

任何实现都会以某种方式累积元素,形成具有一定程度可变性的结构,然后返回一个无法修改的列表。

如何完成的细节取决于实现,但这里有几种可能性:

  • 元素累积成 ArrayList ,然后将其复制到不可变列表中。
  • 元素累积成 ArrayList ,并返回一个防止修改的包装器(例如 Collections.unmodifiableList 。)因为没有其他对象引用原始 ArrayList 。 ,结果是不可变的。
  • 元素被累积到某种技术上不是列表的结构中,例如原始数组,并且该数组被复制或包装在不可变的列表对象中。

选择哪一个实现取决于特定的 Collector你打电话,比如Collectors.toList()ImmutableList.toImmutableList() 。该实现的细节取决于该库的作者,他们可以使用这些策略中的任何一个。

关于java - java流在创建不可变列表时是否创建一些临时列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54353681/

相关文章:

java - 在嵌套的 java Spring 配置属性类中,可以使用父级的值来初始化子级吗?

java - 一列添加两个按钮并获取点击行值javafx

Java Stream 从对象列表生成映射

java - 将 Map<A, B> 转换为 List< Pair<A,B>> - 在 A、B 是类的情况下,这是最有效的吗?

java - JVM如何识别标记接口(interface)?

java - 使用匹配项来匹配整个单词

java - 使用 Java 8 将列表转换为 map

java - 根据两个 Optionals 的值调用不同的方法

java - 在 Java 中从 Optional->List->List 转换的链方法

java - Springboot : How to remove an annotation on a subclass property?