由于无法将任何元素添加到不可变列表中,因此我认为java流首先将元素收集到列表中,然后使用第一个列表中的元素创建一个新的不可变列表。因此,该列表有两个实例,第一个实例可用于垃圾回收。
所以,我的问题是
- stream 是否真的创建了上面提到的两个列表对象?
- 如果没有,stream 如何创建不可变列表?
最佳答案
任何实现都会以某种方式累积元素,形成具有一定程度可变性的结构,然后返回一个无法修改的列表。
如何完成的细节取决于实现,但这里有几种可能性:
- 元素累积成
ArrayList
,然后将其复制到不可变列表中。 - 元素累积成
ArrayList
,并返回一个防止修改的包装器(例如Collections.unmodifiableList
。)因为没有其他对象引用原始ArrayList
。 ,结果是不可变的。 - 元素被累积到某种技术上不是列表的结构中,例如原始数组,并且该数组被复制或包装在不可变的列表对象中。
选择哪一个实现取决于特定的 Collector
你打电话,比如Collectors.toList()
或ImmutableList.toImmutableList()
。该实现的细节取决于该库的作者,他们可以使用这些策略中的任何一个。
关于java - java流在创建不可变列表时是否创建一些临时列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54353681/