【java】浅拷贝与深拷贝详解
Java 浅拷贝与深拷贝原理、实现与代码示例全解析在 Java 中对象拷贝是开发中常见的需求复制对象以避免对原对象的修改在缓存、数据传输、并发场景中保持对象独立理解浅拷贝Shallow Copy和深拷贝Deep Copy的区别对于写出安全、高效的 Java 程序非常重要也是面试常问知识点。本文将系统讲解浅拷贝与深拷贝的概念Java 实现方式多种代码示例常见误区与面试高频点一、浅拷贝Shallow Copy1.1 概念浅拷贝只复制对象本身而不复制对象内部引用的其他对象。原对象和拷贝对象共享内部引用对象。可理解为对象A -- 引用对象X 拷贝对象B -- 同样引用对象X修改引用对象会影响原对象和拷贝对象。1.2 浅拷贝示例假设有一个Person类classPersonimplementsCloneable{Stringname;intage;Addressaddress;// 引用类型publicPerson(Stringname,intage,Addressaddress){this.namename;this.ageage;this.addressaddress;}OverrideprotectedObjectclone()throwsCloneNotSupportedException{returnsuper.clone();// 默认浅拷贝}OverridepublicStringtoString(){returnname, age, address;}}classAddress{Stringcity;publicAddress(Stringcity){this.citycity;}OverridepublicStringtoString(){returncity;}}测试浅拷贝publicclassTestShallow{publicstaticvoidmain(String[]args)throwsCloneNotSupportedException{AddressaddrnewAddress(Beijing);Personp1newPerson(Alice,30,addr);Personp2(Person)p1.clone();System.out.println(p1: p1);System.out.println(p2: p2);// 修改地址p2.address.cityShanghai;System.out.println(修改后 p1: p1);System.out.println(修改后 p2: p2);}}输出结果p1: Alice, 30, Beijing p2: Alice, 30, Beijing 修改后 p1: Alice, 30, Shanghai 修改后 p2: Alice, 30, Shanghai可以看到p1和p2的address是同一个对象浅拷贝不会复制引用对象二、深拷贝Deep Copy2.1 概念深拷贝会复制对象本身以及其内部引用的所有对象原对象和拷贝对象互不影响可理解为对象A -- 引用对象X 拷贝对象B -- 新的引用对象X独立修改引用对象不会影响原对象。2.2 深拷贝实现方式1. 通过clone()方法实现深拷贝在clone()方法中手动复制引用对象classPersonimplementsCloneable{Stringname;intage;Addressaddress;publicPerson(Stringname,intage,Addressaddress){this.namename;this.ageage;this.addressaddress;}OverrideprotectedObjectclone()throwsCloneNotSupportedException{Personcloned(Person)super.clone();cloned.addressnewAddress(this.address.city);// 复制引用对象returncloned;}OverridepublicStringtoString(){returnname, age, address;}}测试深拷贝publicclassTestDeep{publicstaticvoidmain(String[]args)throwsCloneNotSupportedException{AddressaddrnewAddress(Beijing);Personp1newPerson(Alice,30,addr);Personp2(Person)p1.clone();p2.address.cityShanghai;System.out.println(p1: p1);System.out.println(p2: p2);}}输出p1: Alice, 30, Beijing p2: Alice, 30, Shanghai✅ 修改p2.address不影响p1.address2. 通过序列化实现深拷贝利用对象序列化将对象写入字节流再读出importjava.io.*;classPersonimplementsSerializable{Stringname;intage;Addressaddress;publicPerson(Stringname,intage,Addressaddress){this.namename;this.ageage;this.addressaddress;}}classAddressimplementsSerializable{Stringcity;publicAddress(Stringcity){this.citycity;}}publicclassDeepCopyBySerialization{publicstaticvoidmain(String[]args)throwsException{AddressaddrnewAddress(Beijing);Personp1newPerson(Alice,30,addr);// 序列化 - 反序列化ByteArrayOutputStreambosnewByteArrayOutputStream();ObjectOutputStreamoosnewObjectOutputStream(bos);oos.writeObject(p1);ByteArrayInputStreambisnewByteArrayInputStream(bos.toByteArray());ObjectInputStreamoisnewObjectInputStream(bis);Personp2(Person)ois.readObject();p2.address.cityShanghai;System.out.println(p1: p1.address.city);// BeijingSystem.out.println(p2: p2.address.city);// Shanghai}}优点简单、通用可复制复杂对象包含多层引用缺点性能相对慢需要对象实现Serializable接口三、浅拷贝与深拷贝总结类型拷贝内容是否复制引用对象修改引用对象影响原对象实现方式浅拷贝对象本身否会影响Object.clone()默认深拷贝对象及引用对象是不影响手动clone()/ 序列化四、面试高频点1.浅拷贝 vs 深拷贝浅拷贝只复制对象不复制对象引用深拷贝复制对象及其所有引用对象2.Cloneable 接口必须实现才能使用Object.clone()默认clone()是浅拷贝3.序列化深拷贝对象及其引用对象都必须实现Serializable用于复杂对象深拷贝4.修改对象引用的影响浅拷贝修改内部引用会影响原对象深拷贝不会5.集合中的拷贝List、Map、Set 等也涉及浅拷贝与深拷贝复制集合对象时要注意元素引用是否共享示例ListPersonlist1newArrayList();list1.add(newPerson(Alice,30,newAddress(Beijing)));// 浅拷贝集合ListPersonlist2newArrayList(list1);list2.get(0).address.cityShanghai;System.out.println(list1.get(0).address.city);// Shanghai五、总结浅拷贝只复制对象本身引用对象共享深拷贝复制对象及引用对象互不影响实现方式浅拷贝Object.clone()深拷贝手动 clone / 序列化面试重点对象引用的理解Cloneable接口与clone()方法修改内部引用的副作用集合对象的浅拷贝问题

相关新闻

stm32毕业设计2024选题推荐

stm32毕业设计2024选题推荐

【单片机毕业设计项目分享系列】 🔥 这里是DD学长,单片机毕业设计及享100例系列的第一篇,目的是分享高质量的毕设作品给大家。 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的单片机项目缺少创新和亮点…

2026/7/4 14:13:28 阅读更多 →
计算机毕业设计 | SpringBoot+vue入校申报审批系统 大学高校教务管理(附源码+论文)

计算机毕业设计 | SpringBoot+vue入校申报审批系统 大学高校教务管理(附源码+论文)

1,绪论 1.1 研究背景 现在大家正处于互联网加的时代,这个时代它就是一个信息内容无比丰富,信息处理与管理变得越加高效的网络化的时代,这个时代让大家的生活不仅变得更加地便利化,也让时间变得更加地宝贵化&#xff…

2026/5/17 10:25:00 阅读更多 →
OpenClaw 配置 Nginx 反向代理完整指南

OpenClaw 配置 Nginx 反向代理完整指南

OpenClaw 配置 Nginx 反向代理完整指南 将 OpenClaw Gateway 安全地暴露到公网,并通过 HTTPS 和登录保护确保访问安全。 前言 OpenClaw 是一个强大的 AI 助手网关,默认情况下它只监听本地回环地址 (127.0.0.1:18789)。如果你想从外部网络访问 Control U…

2026/7/4 4:56:29 阅读更多 →

最新新闻

OpenCV形态学实战:从腐蚀膨胀到开闭运算,解锁图像处理核心技能

OpenCV形态学实战:从腐蚀膨胀到开闭运算,解锁图像处理核心技能

1. 形态学操作:图像处理的"外科手术刀"第一次接触OpenCV的形态学操作时,我正处理一批医学显微图像。那些粘连在一起的血细胞就像煮过头的饺子,完全分不清个数。导师当时说:"试试形态学操作吧,这是图像处…

2026/7/5 12:39:52 阅读更多 →
目标检测实战:从理论到实践攻克小目标与遮挡难题

目标检测实战:从理论到实践攻克小目标与遮挡难题

1. 小目标检测的挑战与核心问题小目标检测一直是计算机视觉领域的难点问题。在实际项目中,我们经常会遇到无人机航拍图像中的车辆、工厂流水线上的微小零件,或是监控摄像头中远距离的行人。这些目标在图像中往往只占据几十甚至几个像素,给检测…

2026/7/5 12:39:52 阅读更多 →
YOLOv8结合PointRend提升小目标分割精度实战

YOLOv8结合PointRend提升小目标分割精度实战

1. 项目概述:当YOLOv8遇上小目标分割难题在计算机视觉的实际工程应用中,小目标分割一直是个令人头疼的问题。想象一下在卫星图像中识别车辆、在工业质检中检测微小缺陷,或者在医学影像中分割细胞核——这些场景中的目标往往只占图像的几十甚至…

2026/7/5 12:37:52 阅读更多 →
模特ai图如何高效生成?多平台快速制作技巧分享

模特ai图如何高效生成?多平台快速制作技巧分享

在电商行业,模特ai图的高效生成已成为商品展示的核心环节。随着AI技术的发展,各类平台助力模特图自动化处理,让从业者效率显著提升。 本文将系统介绍多款相关平台的主要功能与适配优势,帮助你深入了解模特ai图制作的实际场景与选…

2026/7/5 12:35:51 阅读更多 →
AI推理服务Invalid Argument错误:构建健壮数据校验与预处理流水线

AI推理服务Invalid Argument错误:构建健壮数据校验与预处理流水线

1. 项目概述:从一次深夜告警说起凌晨两点,手机突然震动,监控告警提示线上AI推理服务大面积报错,错误信息赫然是“Invalid Argument”。相信不少负责模型部署和线上服务的同行都经历过这种心跳加速的时刻。这个错误看似简单&#x…

2026/7/5 12:33:50 阅读更多 →
Carsim中构建多车道动态交通流与智能车辆交互场景

Carsim中构建多车道动态交通流与智能车辆交互场景

1. Carsim多车道动态交通流搭建基础在智能驾驶算法开发过程中,真实还原多车道交通环境是验证ADAS功能的关键。Carsim作为行业标准的车辆动力学仿真平台,其ADAS模块提供了高度灵活的交通场景构建能力。我最近在测试ACC自适应巡航功能时,就遇到…

2026/7/5 12:33:50 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻