博客
关于我
深拷贝和浅拷贝
阅读量:90 次
发布时间:2019-02-26

本文共 2025 字,大约阅读时间需要 6 分钟。

Java对象拷贝:浅拷贝与深拷贝的区别及实现

1. 引用拷贝

引用拷贝是最简单的对象拷贝方式。在Java中,当你将一个对象的引用赋值给另一个引用变量时,实际上是将两个引用指向同一个对象。这意味着两个引用共享了同一个对象的内存空间。

示例1:

Teacher teacher = new Teacher("Taylor", 26);Teacher otherteacher = teacher;System.out.println(teachers);System.out.println(otherteacher);

输出结果:

blog.Teacher@355da254blog.Teacher@355da254

结果分析:两个引用 teacherotherteacher 指向相同的对象。引用拷贝只是将两个引用指向同一个对象,并未创建新对象。


2. 对象拷贝

对象拷贝则会创建一个新对象,并将原对象的属性值复制到新对象中。Java提供了 Cloneable 接口,通过 clone() 方法实现浅拷贝。深拷贝则需要自定义实现,通常使用序列化或其他方式。

示例2:

Teacher teacher = new Teacher("Swift", 26);Teacher otherteacher = (Teacher)teacher.clone();System.out.println(teachers);System.out.println(otherteacher);

输出结果:

blog.Teacher@355da254blog.Teacher@4dc63996

结果分析:两个引用 teacherotherteacher 指向不同的对象。对象拷贝通过 clone() 方法实现,创造了新对象的副本。


3. 浅拷贝

浅拷贝(Shallow Copy)只复制对象的主对象(即直接属性),而不复制其引用对象。因此,原对象和副本共享引用对象的内存空间。

示例3:

Teacher teacher = new Teacher();teacher.setName("Delacey");teacher.setAge(29);Student2 student1 = new Student2();student1.setName("Dream");student1.setAge(18);student1.setTeacher(teacher);Student2 student2 = (Student2) student1.clone();

输出结果:

拷贝后Dream18Delacey29修改老师的信息后:JamJam

结果分析:两个 Student 对象共享同一个 Teacher 对象。修改原对象的属性会影响两个引用对象的属性。


4. 深拷贝

深拷贝(Deep Copy)会复制对象及其所有引用的对象。通过这种方式,原对象和副本完全独立,不共享任何内存空间。

示例4:

Teacher2 teacher = new Teacher2();teacher.setName("Delacey");teacher.setAge(29);Student3 student1 = new Student3();student1.setName("Dream");student1.setAge(18);student1.setTeacher(teacher);Student3 student2 = (Student3) student1.clone();

输出结果:

拷贝后Dream18Delacey29修改老师的信息后:JamJam

结果分析:两个 Student 对象各自拥有独立的 Teacher 对象。修改原对象的属性不会影响另一个引用对象的属性。


5. 通过序列化实现深拷贝

序列化是一种常用的深拷贝实现方法。通过将对象序列化为字节流,再反序列化得到副本,可以实现对象的深拷贝。

示例5:

Teacher3 t = new Teacher3();t.setName("Taylor");t.setAge(28);Student3 s1 = new Student3();s1.setAge(20);s1.setName("blank space");s1.setTeacher(t);Student3 s2 = (Student3) s1.deepClone();

输出结果:

拷贝后:blank space20Taylor28修改后:swiftswift

结果分析:通过序列化实现了深拷贝。修改原对象的属性不会影响副本的属性。


浅拷贝和深拷贝的主要区别在于是否共享引用对象的内存空间。选择使用哪一种拷贝方式取决于具体需求:如果仅需快速拷贝且不关心引用对象的独立性,浅拷贝即可;如果需要完全独立的对象副本,深拷贝是更好的选择。

转载地址:http://meiu.baihongyu.com/

你可能感兴趣的文章
OAuth2.0_介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记137
查看>>
OAuth2.0_完善环境配置_把资源微服务客户端信息_授权码存入到数据库_Spring Security OAuth2.0认证授权---springcloud工作笔记149
查看>>
OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
查看>>
OAuth2.0_授权服务配置_令牌服务和令牌端点配置_Spring Security OAuth2.0认证授权---springcloud工作笔记143
查看>>
OAuth2.0_授权服务配置_客户端详情配置_Spring Security OAuth2.0认证授权---springcloud工作笔记142
查看>>
OAuth2.0_授权服务配置_密码模式及其他模式_Spring Security OAuth2.0认证授权---springcloud工作笔记145
查看>>
OAuth2.0_授权服务配置_资源服务测试_Spring Security OAuth2.0认证授权---springcloud工作笔记146
查看>>
OAuth2.0_环境介绍_授权服务和资源服务_Spring Security OAuth2.0认证授权---springcloud工作笔记138
查看>>
OAuth2.0_环境搭建_Spring Security OAuth2.0认证授权---springcloud工作笔记139
查看>>
oauth2.0协议介绍,核心概念和角色,工作流程,概念和用途
查看>>
OAuth2.0四种模式的详解
查看>>
OAuth2授权码模式详细流程(一)——站在OAuth2设计者的角度来理解code
查看>>
oauth2登录认证之SpringSecurity源码分析
查看>>
OAuth2:项目演示-模拟微信授权登录京东
查看>>
OA系统多少钱?OA办公系统中的价格选型
查看>>
OA系统选型:选择好的工作流引擎
查看>>
OA让企业业务流程管理科学有“据”
查看>>
OA项目之会议通知(查询&是否参会&反馈详情)
查看>>
Vue.js 学习总结(13)—— Vue3 version 计数介绍
查看>>
OA项目之我的会议(会议排座&送审)
查看>>