Tob*_*obi 7 java memory java-8 java-stream
我想知道如果终端操作是列表收集器,Java 8流如何处理内存分配.
例如,考虑一下
List<Integer> result = myList.stream().map(doWhatever).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
VS
List<Integer> result = new ArrayList<>(myList.size());
for(String s : myList) {
result.add(doWhatever.apply(s));
}
Run Code Online (Sandbox Code Playgroud)
如果使用流,则不知道列表将增长多少,这意味着必须进行某种重新分配.这个假设是真的吗?
结果列表的类型是某种链表,因此对元素的访问速度比ArrayList慢吗?
如果我从一开始就知道结果列表的大小,我是不是应该使用带有列表收集器的流?
在场景后面Collectors.toList()将允许使用默认构造函数将您生成的元素收集Stream到一个ArrayList创建的默认容量中,10因此在大小超过的情况下确实需要重新分配10.
如果你想使用不同List的实现,请使用toCollection(Supplier<C> collectionFactory)哪个更通用的收集器,允许提供目标的工厂Collection.
例如,如果要将元素收集到一个LinkedList代码中,则可以将代码重写为下一个:
List<Integer> result = myList.stream()
.map(doWhatever)
.collect(Collectors.toCollection(LinkedList::new));
Run Code Online (Sandbox Code Playgroud)
假设你想要ArrayList一个默认容量为100,收集器就是Collectors.toCollection(() -> new ArrayList<>(100)).
Collectors.toList()未指定任何关于它的实现.如果你在意,请使用toCollection(ArrayList::new).
如果我从一开始就知道结果列表的大小,我是不是应该使用带有列表收集器的流?
不,继续使用它们.分配是便宜的,相对于简洁性的胜利,成本是最小的.预定列表通常是不成熟的优化.
| 归档时间: |
|
| 查看次数: |
1459 次 |
| 最近记录: |