Java17的stream流里toList和.collect(Collectors.toList())有什么不同

源码分析:

复制代码
.collect(Collectors.toList());
复制代码
    public static <T>
    Collector<T, ?, List<T>> toList() {
        return new CollectorImpl<>(ArrayList::new, List::add,
                                   (left, right) -> { left.addAll(right); return left; },
                                   CH_ID);
    }

在源码里能看到,使用.collect(Collectors.toList());收集出来的list实际类是ArrayList

.tolist

复制代码
    default List<T> toList() {
        return (List<T>) Collections.unmodifiableList(new ArrayList<>(Arrays.asList(this.toArray())));
    }

    @SuppressWarnings("unchecked")
    public static <T> List<T> unmodifiableList(List<? extends T> list) {
        if (list.getClass() == UnmodifiableList.class || list.getClass() == UnmodifiableRandomAccessList.class) {
           return (List<T>) list;
        }

        return (list instanceof RandomAccess ?
                new UnmodifiableRandomAccessList<>(list) :
                new UnmodifiableList<>(list));
    }

但是tolist收集出来的list实际类是UnmodifiableList这个类

UnmodifiableList 介绍

UnmodifiableList 是 Java 中的一个类,用于创建不可修改的列表。它实际上是通过 Collections.unmodifiableList() 方法创建的。一旦列表被创建为不可修改的,就无法对其进行添加、删除或修改元素的操作。这种列表对于保护数据不被意外修改或者共享数据而不希望被修改很有用。当你想要确保某个列表在传递给其他代码时不会被修改时,可以使用 UnmodifiableList 来包装你的列表。

结论:如果你想在stream后对list进行修改操作,那么就用.collect(Collectors.toList());,如果不想结果被修改操作,那么就直接使用.toList();

相关推荐
努力的小帅4 分钟前
c++——二叉树进阶
开发语言·数据结构·c++·学习·算法·面试
loveLifeLoveCoding7 分钟前
springboot 加载 tomcat 源码追踪
java·spring boot·spring
幽络源小助理11 分钟前
SpringBoot框架开发网络安全科普系统开发实现
java·spring boot·后端·spring·web安全
俺不是西瓜太郎´•ﻌ•`42 分钟前
二维差分数组(JAVA)蓝桥杯
java·开发语言·蓝桥杯
go_bai43 分钟前
C++——继承
开发语言·c++·笔记·学习·学习方法
cainiao0806051 小时前
Java大数据可视化在城市空气质量监测与污染溯源中的应用:GIS与实时数据流的技术融合
java·开发语言·信息可视化
268572591 小时前
Java 23种设计模式 - 行为型模式11种
java·开发语言·设计模式
White_Can1 小时前
《C++探幽:模板从初阶到进阶》
开发语言·c++
不会飞的鲨鱼1 小时前
Windows系统下【Celery任务队列】python使用celery 详解(二)
开发语言·windows·python
南玖yy1 小时前
内存安全暗战:从 CVE-2025-21298 看 C 语言防御体系的范式革命
c语言·开发语言·人工智能·struts·安全·架构·交互