List.copyOf 创建不可变浅快照:复用原数组、共享元素引用、禁止修改、不依赖原列表生命周期;非深拷贝,也不支持写操作。

List.copyOf 不是深拷贝,也不是传统意义上的“拷贝”——它做的是不可变的浅快照。它不复制元素对象本身,也不递归克隆嵌套结构,只把当前列表里那一层引用“冻结”成一个不可修改的视图。
它到底做了什么(浅快照的本质)
• 底层复用原列表的内部数组(Java 11+ 的紧凑结构),没有逐个 new 对象,也没有序列化或反射开销
• 新返回的 List 是独立实例,但每个元素仍是原列表中对象的**同一引用**
• 原列表后续 add/remove 不会影响副本内容,副本也禁止任何修改操作(调 add/remove 直接抛 UnsupportedOperationException)
• 如果原列表里存的是 String、Integer 等不可变对象,那副本看起来“安全”;但若存的是自定义可变对象(比如 Person),改它的字段(如 person.setName("X")),副本里看到的也会变
和常见“浅拷贝”方式的区别
• new ArrayList(list):新建可变容器 + 浅拷贝引用 → 元素共享,但你能往里 add、sort、clear
• Collections.unmodifiableList(list):不拷贝,只是加一层拦截包装 → 若原始 list 引用泄露,别人仍可修改底层数据
• List.copyOf(list):立即提取当前内容,生成全新不可变实例 → 不依赖原 list 生命周期,也不怕原始引用被滥用
什么时候用它?关键看需求
• ✅ 需要“此刻值、绝不许改、不关心后续变化”:比如返回 API 响应中的配置项、枚举常量集合、日志快照
• ❌ 需要后续增删/排序/过滤:它不支持任何写操作
• ❌ 需要隔离对象内部状态:它不管 Person.name 字段会不会被改,只管 list 结构本身不可变
立即学习“Java免费学习笔记(深入)”;
真要深拷贝?它帮不上忙
• List.copyOf 完全不处理嵌套对象的复制逻辑
• 深拷贝得靠别的方案:比如手动遍历 clone(要求类实现 Cloneable)、序列化反序列化(要求所有字段可序列化)、或使用第三方库(如 Apache Commons Lang 的 SerializationUtils.clone)
• 注意:深拷贝代价高,多数场景其实只需要“不可变视图”或“独立可变副本”,而非真正递归复制


















