当前位置: 首页 > news >正文

深拷贝和浅拷贝的区别

浅拷贝:

        只复制原对象的基本数据类型字段,拥有相对独立的副本数据,修改时不会影响到原对象的字段值。对于原对象的引用数据类型字段,直接共享原对象字段的引用,修改自己的字段时会同时影响原对象。

深拷贝:

        对于基本数据类型,与浅拷贝一致,而对于引用数据类型字段,则使用递归(引用类型字段内部可能也有引用类型字段)将原对象的所有引用类型字段的内容也复制一份,以此保证两个对象的修改操作不会影响对方。

实现深拷贝的三种方法:

        1、实现 Cloneable 接口并重写 clone() 方法:

        前提对象的所有引用数据类型,都需要重写clone()方法。对象在 clone() 方法中,通过递归克隆引用类型字段来实现深拷贝。clone()方法默认实现浅拷贝,想实现深拷贝需要先获得浅拷贝后的对象,再调用引用类型字段的clone()方法获取浅拷贝后的对象。(如果引用类型字段还有引用类型字段则重复此操作,直到只有基本数据类型字段)。实质上就是先拷贝最底层的引用类型字段,再逐步赋值并拷贝上层的引用类型字段,直到获取我们需要的对象。

class Professor implements Cloneable {String name;@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();//默认浅拷贝操作,如果该类也有引用类型字段则类似于Student的操作递归实现浅拷贝——深拷贝字段赋值,直到引用类型字段内部只有基本数据类型为止}
}
class Student implements Cloneable {Professor p;@Overridepublic Object clone() throws CloneNotSupportedException {Student cloned = (Student) super.clone();// 先浅拷贝当前对象cloned.p = (Professor) this.p.clone(); // 深拷贝引用类型字段并赋值return cloned;}
}
        2、序列化和反序列化原对象

       前提对象的所有引用数据类型都应该实现Serilizable接口。通过序列化和反序列化原对象,并使用新对象接收返回值。当一个对象被序列化和反序列化后,默认创建新的引用类型对象进行字段的赋值,达到深拷贝的效果。

        3、手动递归复制:

        类似于重写clone()方法,在进行深拷贝时,通过调用引用数据类型字段的自定义的深拷贝方法手动创建新对象赋值到引用数据类型字段中。

class MyClass {private String field1;private NestedClass nestedObject;public MyClass deepCopy() {MyClass copy = new MyClass();copy
.setField1(this.field1);copy
.setNestedObject(this.nestedObject.deepCopy());return copy;}
}class NestedClass {private int nestedField;public NestedClass deepCopy() {NestedClass copy = new NestedClass();copy
.setNestedField(this.nestedField);return copy;}
}

http://www.xdnf.cn/news/44281.html

相关文章:

  • React Router V7使用详解
  • LeetCode[232]用栈实现队列
  • PySide6 GUI 学习笔记——常用类及控件使用方法(常用类矩阵QRect)
  • Hello, Dirty page
  • 【Flutter】使用LiveKit和Flutter构建实时视频聊天应用
  • Linux操作系统--进程的创建和终止
  • java面试篇(常见的集合底层原理)
  • 中国占全球工业机器人装机量的52%,国产机器人崛起加速洗牌,拆分机器人业务独立上市,软硬件协同增强,AI工业机械臂催生业务再增长
  • Opencv图像处理:轮廓检测、轮廓近似、绘制外接圆外接矩形
  • Linux学习——TCP
  • Viper配置管理笔记
  • 基于springboot+vue的仓库管理系统
  • AI日报 - 2025年04月19日
  • 《Operating System Concepts》阅读笔记:p748-p748
  • C# 类型、存储和变量(用户定义类型)
  • python pdf转图片再OCR
  • WebSocket启用备忘
  • 【C++】类和对象之日期类的实现(构造、运算符重载)
  • Deepseek输出的内容如何直接转化为word文件?
  • PFLM: Privacy-preserving federated learning with membership proof证明阅读
  • mysql中的group by用法详解
  • 大模型安全吗?数据泄露与AI伦理的黑暗面!
  • 【数据结构_12】二叉树(4)
  • redis 中的 String 数据结构
  • 【Linux系统】Linux基础指令(详解Linux命令行常用指令,每一个指令都有示例演示)
  • 【2025计算机网络-面试常问】http和https区别是什么,http的内容有哪些,https用的是对称加密还是非对称加密,流程是怎么样的
  • 【人工智能】推荐开源企业级OCR大模型InternVL3
  • 【后端开发】MyBatis
  • 树莓派系统中设置固定 IP
  • Oracle 23ai Vector Search 系列之6 向量相似性搜索(Similarity Search)