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();

相关推荐
阿里嘎多学长6 分钟前
2025-12-31 GitHub 热点项目精选
开发语言·程序员·github·代码托管
xjz184211 分钟前
JVM虚拟线程:JEP 444开启Java并发编程新纪元
java
JH307311 分钟前
Spring Retry 实战:优雅搞定重试需求
java·后端·spring
无限进步_16 分钟前
【C语言】循环队列的两种实现:数组与链表的对比分析
c语言·开发语言·数据结构·c++·leetcode·链表·visual studio
蓝眸少年CY26 分钟前
测试Java性能
java·开发语言·python
何包蛋H26 分钟前
数据结构深度解析:Java Map 家族完全指南
java·开发语言·数据结构
秃了也弱了。27 分钟前
python监听文件变化:Watchdog库
开发语言·python
一路往蓝-Anbo32 分钟前
C语言从句柄到对象 (五) —— 虚函数表 (V-Table) 与 RAM 的救赎
c语言·开发语言·stm32·单片机·物联网
古译汉书33 分钟前
keil编译错误:Error: Flash Download failed
开发语言·数据结构·stm32·单片机·嵌入式硬件
Bruce_kaizy34 分钟前
2025年年度总结!!!!!!!!!!!!!!!!!!!!!!!!!!!
开发语言·c++