【Go】Go语言中深拷贝和浅拷贝

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,优快云全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,Golang开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:Go语言开发零基础到高阶实战
景天的主页:景天科技苑

在这里插入图片描述

### Java 深拷贝浅拷贝的概念 在 Java 中,深拷贝(Deep Copy)浅拷贝(Shallow Copy)是用于创建新对象副本的两种不同机制。浅拷贝仅复制对象的基本数据类型字段及其引用类型的地址;而深拷贝则不仅复制这些基本信息,还递归地复制所有被引用的对象实例[^1]。 #### 浅拷贝的特点 当执行浅拷贝操作时,如果源对象包含其他对象作为成员变量,则目标对象中的相应位置将保存指向相同子对象的指针而不是实际的数据副本。这意味着两个对象实际上共享同一组内部组件,在其中一个上所做的任何更改都会影响到另一个[^2]。 #### 深拷贝的优势 相比之下,通过实施深拷贝策略可以确保所获得的新实体与其原型之间没有任何关联——无论是直接属性还是间接依赖项都被彻底克隆出来形成全新的个体。因此,即使后续对任一方进行了改动也不会波及对方的状态或行为模式[^3]。 ### 实现方式对比 以下是几种常见的实现这两种拷贝的方法: #### 方法一:利用 `Cloneable` 接口与 `clone()` 函数完成浅拷贝 要使类支持浅层复制功能,需让其继承自标准库定义好的接口 `java.lang.Cloneable` 并覆盖默认版本的公共方法 clone() 。注意此时返回的是 Object 类型的结果,通常还需要强制转换回原类型以便进一步使用[^5]。 ```java public class Person implements Cloneable { private String name; private Address address; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } ``` 这种方法简单易懂但存在局限性,因为它无法解决嵌套对象间的相互关系维护问题,即它只做了最表面一层的数据迁移工作而不涉及更深层次的内容同步处理。 #### 方法二:借助序列化技术达成深拷贝效果 另一种较为通用的做法就是采用序列化的手段来达到深层复制的目的。具体而言就是在内存中先将待仿制的目标转化为字节数组形式存储起来然后再反向解析还原成新的实例。此过程能够有效规避上述提到的各种隐患从而保证最终产物具备高度的一致性独立性[^4]。 ```java import java.io.*; public class DeepCopyUtil { public static <T> T deepCopy(T object) throws IOException, ClassNotFoundException { // 序列化 ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(object); // 反序列化 ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return (T) ois.readObject(); } } ``` 此外还有基于反射API构建辅助工具类或是引入第三方框架如 Apache Commons Lang 提供的支持函数等方式可供选择,不过这里不再赘述。
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

景天科技苑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值