Java 8 流列表收集器内存分配速度与带有预分配的循环

标签 java memory java-8 java-stream

如果终端操作是列表收集器,我想知道 Java 8 流如何处理内存分配。

例如考虑

List<Integer> result = myList.stream().map(doWhatever).collect(Collectors.toList());

List<Integer> result = new ArrayList<>(myList.size());
for(String s : myList) {
  result.add(doWhatever.apply(s));
}

在使用流的情况下,不知道列表会增长到多大,这意味着必须进行某种重新分配。这个假设是真的吗?

结果列表的类型是某种链表,因此访问元素的速度比 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));

假设您想要 ArrayList默认容量为 100 ,收集器将是 Collectors.toCollection(() -> new ArrayList<>(100)) .

关于Java 8 流列表收集器内存分配速度与带有预分配的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40893043/

相关文章:

java - CSV Writer 在每行之间添加空行

java - 如何以面向对象的方式处理Hibernate hql多连接查询结果?

memory - 是什么导致 CUDA 中的指令重放开销

c - Valgrind 在尝试释放 malloc 结构时报告内存错误

memory - VBScript 在创意者更新后消耗内存(Win 10,64 位)

java - while 循环中仅打印一次语句

java - Android Studio : App crashing after Splash screen

java - 如何在 LinkedList 中搜索特定单词并返回它在列表中的位置以及出现的次数

java - Scala 中的传递函数

multithreading - 将实例调用到同一线程内的线程