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

详解集合的序列化与克隆_深拷贝与浅拷贝在容器中的表现对比

落宇小哥_3543

落宇小哥_3543

发布时间:2026-03-06 08:18:14

|

721人浏览过

|

来源于php中文网

原创

Java中ArrayList.clone()只做浅拷贝,新列表与原列表共享元素引用,修改副本中的自定义对象会影响原列表;修复需手动深拷贝或序列化方案。

详解集合的序列化与克隆_深拷贝与浅拷贝在容器中的表现对比

Java里用clone()克隆ArrayList,为什么改副本还影响原列表?

因为ArrayList.clone()只做浅拷贝——它新建了一个ArrayList容器,但里面存的元素引用没变。如果元素是自定义对象(比如User),两个列表里的User实例还是同一个对象。

  • 现象:修改list2.get(0).setName("Alice"),list1.get(0)的名字也变了
  • 原因:clone()没递归复制元素,只复制了数组引用本身
  • 修复方式:不能只靠clone(),得手动遍历+深拷贝每个元素,或换序列化方案
  • 注意:Arrays.asList(...).clone()甚至不工作——返回的是不可变视图,clone()抛UnsupportedOperationException

Python中copy.copy()和copy.deepcopy()对嵌套列表的行为差异

copy.copy()只复制外层容器,子列表仍是原引用;copy.deepcopy()才真正断开所有层级的引用链。

  • 常见错误:用ys = copy.copy(xs)处理xs = [[1,2], [3,4]],然后ys[0].append(99)会导致xs[0]也多出99
  • 性能代价:deepcopy要递归遍历整个对象图,遇到循环引用会报RecursionError,大数据量时明显变慢
  • 替代思路:若结构固定(如全是字典/列表),可用json.loads(json.dumps(obj))快速“伪深拷贝”,但不支持函数、datetime、自定义类等非JSON类型

Spring项目里DTO传参总被意外修改?别只依赖MapStruct的@Mapping

MapStruct默认生成的映射方法是浅拷贝逻辑——源对象字段是引用类型时,目标对象拿到的仍是同一份引用。这在Service层并发调用或事务回滚场景下极易引发数据污染。

  • 典型症状:A线程修改了DTO里的order.getItems(),B线程读到的也是改后的集合
  • 解决路径:在@Mapper接口上加uses = {CollectionMapper.class},并自定义CollectionMapper对List做new ArrayList(source)或逐项clone()
  • 更稳妥做法:DTO类自身实现Serializable,配合工具类SerializationUtils.clone(dto)(来自Spring Core),确保彻底隔离
  • 坑点:SerializationUtils.clone()要求所有嵌套对象都可序列化,否则抛NotSerializableException,需逐级检查

为什么序列化反序列化是“最老实”的深拷贝方案?

它绕过了所有引用共享的可能性——把对象写成字节流再重读,等于强制重建整个对象树,天然切断所有内存地址关联。

  • 优势:不依赖对象是否实现Cloneable,也不关心字段是否private或final,只要可序列化就生效
  • 代价:性能开销大(IO+反射)、无法序列化Thread/Socket等JVM资源类、静态字段和transient字段丢失
  • 实用技巧:生产环境慎用ObjectOutputStream直接序列化,优先选Kryo或FST等高性能替代库,避免java.io的GC压力
  • 关键提醒:序列化深拷贝 ≠ 安全深拷贝——若类里有final字段指向可变对象(如final List<string> tags</string>),反序列化后仍可能被外部修改
深拷贝从来不是一锤定音的操作,而是根据容器结构、嵌套深度、运行环境反复权衡的结果。最容易被忽略的,是那些看似“不可变”实则内部可变的字段——它们让深拷贝在最后一层失效。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

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

WorkBuddy

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

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

豆包大模型

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

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

DeepSeek

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

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

11897

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

9002

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

7712

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1264

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1008

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

1516

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

3109

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

20371

2023.08.03

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

0

2026.11.03

热门下载

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

精品课程

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

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