梦里不觉秋已深,余情岂是为他人

第一次写博客,当做记事本吧

### Java 浅拷贝与深拷贝的区别 在Java中,浅拷贝(Shallow Copy)仅复制对象本身及其基本数据类型的字段;对于引用类型的数据,则只是简单地复制其引用地址而非实际的对象实例[^1]。这意味着如果原始对象和新对象都包含指向其他对象的引用,在通过浅拷贝创建的新对象中这些引用仍然指向相同的底层对象。 相比之下,深拷贝(Deep Copy)不仅会复制源对象的基本属性,还会递归地为每一个由该对象持有的子对象也执行同样的操作——即针对每个引用型成员变量都会新建独立的对象副本[^2]。因此,经过深拷贝后的两个对象之间没有任何共享状态,彼此完全隔离,互不影响。 #### 实现方法对比 为了实现浅拷贝,通常可以通过调用`Object.clone()`方法并重写类中的`clone()`函数来完成。需要注意的是,默认情况下`clone()`只会做浅层复制: ```java public class ShallowCopyExample implements Cloneable { private int value; private Object reference; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } ``` 而要达到真正的深拷贝效果,则可以考虑采用序列化的方式或者手动编写构造器来进行逐级克隆: ```java import java.io.*; public class DeepCopyExample implements Serializable { private static final long serialVersionUID = 1L; public String name; transient public int age; // Transient fields will not be serialized // Deep copy using serialization public DeepCopyExample deepCopy() throws IOException, ClassNotFoundException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(bos); out.writeObject(this); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream in = new ObjectInputStream(bis); return (DeepCopyExample)in.readObject(); } // Alternatively, implement a custom constructor or method to manually create copies of all nested objects. } ``` ### 使用场景分析 - **浅拷贝适用场合**:当目标对象结构较为简单,不涉及复杂嵌套关系或是对外部资源依赖较少的情况下可以选择使用浅拷贝。例如,某些简单的POJO(Plain Old Java Objects),其中大部分都是基础数据类型或不可变对象时,可以直接利用浅拷贝提高效率[^3]。 - **深拷贝适用场合**:对于那些具有多层级关联、存在循环引用或者是需要确保绝对独立性的对象来说,应该优先选用深拷贝策略。比如在一个复杂的图形编辑软件,用户可能希望每次撤销/恢复操作都能得到一个全新的画布快照而不是仅仅改变当前视图的状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值