讲师中心 微信公众号
AI工具推荐 视频效率加速

在Java里如何复制一个集合_Java集合拷贝方式解析

落瑶小哥_4919

落瑶小哥_4919

发布时间:2026-01-20 02:55:10

|

639人浏览过

|

来源于php中文网

原创

Java中浅拷贝集合最安全通用的方式是使用构造函数(如new ArrayList<>(source)),它创建独立集合对象但共享元素引用;深拷贝需手动实现,不可变集合拷贝需确保源头安全。

在java里如何复制一个集合_java集合拷贝方式解析

Java中浅拷贝集合的通用方式

绝大多数场景下,用构造函数创建新集合就是最安全、最直观的拷贝方式。它不依赖具体实现类的内部状态,也不要求元素可序列化,适用于 ArrayList、HashSet、LinkedHashMap 等几乎所有标准集合。

这种拷贝是浅拷贝:新集合对象独立,但其中的元素引用与原集合相同。如果元素是不可变对象(如 String、Integer),完全没问题;如果元素是可变对象(如自定义的 User 类实例),后续修改该元素会影响两边集合里的对应项。

List<String> original = Arrays.asList("a", "b", "c");
List<String> copy = new ArrayList<>(original); // ✅ 安全、简洁、推荐
  • new ArrayList<>(source)、new HashSet<>(source) 等构造器均支持 Collection 参数,兼容所有实现了该接口的集合
  • 不要用 list.clone() —— 它返回 Object,需强转,且对某些子类(如 LinkedList)未重写时行为不确定
  • 避免直接赋值:List<String> copy = original; 这只是引用复制,两边操作同一对象

需要深拷贝时该怎么做

当集合里存的是可变对象,且你希望两边完全隔离(改副本不影响原集合,反之亦然),就必须深拷贝。Java 没有内置通用深拷贝机制,必须手动处理。

常见做法是遍历原集合,对每个元素调用其自身的拷贝逻辑。这要求元素类型提供明确的复制能力,比如实现 Cloneable 并重写 clone(),或提供拷贝构造函数 / 工厂方法。

Java Maven Common
Java Maven Common

Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。

下载

立即学习“Java免费学习笔记(深入)”;

List<User> original = Arrays.asList(new User("Alice", 25), new User("Bob", 30));
List<User> deepCopy = original.stream()
    .map(u -> new User(u.getName(), u.getAge())) // 假设 User 有拷贝构造函数
    .collect(Collectors.toList());
  • 不要依赖 Serializable + 序列化反序列化来做深拷贝——性能差、抛检异常多、要求所有字段及嵌套对象都可序列化
  • 若元素类型已实现 clone(),可用 u.clone(),但注意它返回 Object,需强制转型,且语义是否真正“深”取决于实现
  • Gson / Jackson 等 JSON 库做“伪深拷贝”仅适用于简单 POJO,遇到循环引用、泛型擦除、非标准 setter/getter 会失败

不可变集合复制的特殊处理

如果你拿到的是 Collections.unmodifiableXXX() 或 ImmutableList.of()(Guava)这类不可变集合,不能直接修改,但构造新集合依然有效。不过要注意:它们包装的底层集合仍可能被外部修改(除非底层本身也不可变)。

例如,Collections.unmodifiableList(new ArrayList<>()) 返回的“不可变视图”,其底层数组仍可通过原始引用修改——所以拷贝时应确保源头也是安全的。

  • 对 unmodifiableList 调用 new ArrayList<>(it) 是合法且常用的解包方式
  • Guava 的 ImmutableList.copyOf() 接收任意 Iterable,返回真正不可变副本,适合需要传递只读数据的场景
  • Java 10+ 的 List.of() 创建的是不可变集合,尝试用它构造新 ArrayList 没问题,但反过来不能把 ArrayList 直接传给 List.of() 当参数(会报 UnsupportedOperationException)

Stream.collect() 和传统循环哪个更合适

用 stream().collect(Collectors.toList()) 拷贝集合,本质上和构造函数一样是浅拷贝,但多了函数式开销。除非你在流中同时做转换(如过滤、映射),否则没必要绕一圈。

性能上,构造函数直接调用 addAll() 或数组批量复制,通常比 Stream 更快,尤其在小集合(

  • 纯拷贝就用 new ArrayList<>(src) —— 语义清晰、零额外依赖、IDE 友好、调试直观
  • 如果已在流链路中(比如刚 filter 完),接着 .collect(toList()) 是自然选择
  • 避免写 src.stream().collect(Collectors.toCollection(ArrayList::new)) —— 多余,等价于构造函数,还更啰嗦
深拷贝没有银弹,关键在厘清“要不要真隔离”;而浅拷贝看似简单,最容易栽在误以为 clone() 或 Arrays.asList() 返回的是独立副本上。

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2135

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3302

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1116

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3779

2025.09.10

guava包作用
guava包作用

guava是一个java库,增强了java标准库,提供更有效率和易于使用的集合、实用程序、缓存和并发工具。想了解更多guava的相关内容,可以阅读本专题下面的文章。

5251

2024.05.29

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6439

2023.08.02

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3148

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

4929

2025.10.17

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

0

2026.10.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn