深拷贝和浅拷贝实现方法
Java 中的深拷贝与浅拷贝
在Java中,对象的复制可以通过深拷贝和浅拷贝来完成。两者的主要区别在于处理对象内部引用的方式。
浅拷贝 (Shallow Copy)
浅拷贝会创建一个新的对象,这个新对象会拥有原对象属性值的一份精确拷贝。但是,如果这些属性指向的是其他对象,则只会复制这些对象的引用地址,而不是创建新的对象实例[^1]。
public class ShallowCopyExample implements Cloneable {
private int value;
private Object reference;
public ShallowCopyExample(int value, Object reference) {
this.value = value;
this.reference = reference;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
上述代码展示了如何利用Cloneable
接口实现浅拷贝功能。需要注意的是,默认情况下,clone()
方法仅执行字段级别的复制,并不会递归地克隆嵌套的对象结构[^2]。
深拷贝 (Deep Copy)
相比之下,深拷贝不仅复制了对象本身的数据成员,还会递归地复制所有被该对象持有的子对象。这意味着即使是最深层级的对象也会得到全新的独立副本,从而确保两个对象之间没有任何共享状态。
一种常见的做法是在类中重写clone()
方法并手动调用每个非基本类型的成员变量对应的clone()
方法:
import java.util.ArrayList;
import java.util.List;
class DeepCopyExample implements Cloneable {
private List<String> list;
public DeepCopyExample(List<String> list) {
this.list = new ArrayList<>(list);
}
@Override
protected DeepCopyExample clone() throws CloneNotSupportedException {
// 创建当前对象的新实例
DeepCopyExample clonedObject = (DeepCopyExample)super.clone();
// 对于每一个复杂类型成员都重新分配内存空间
clonedObject.list = new ArrayList<>();
for(String item : this.list){
clonedObject.list.add(new String(item));
}
return clonedObject;
}
}
这段代码实现了对列表内字符串元素的安全复制,避免了源对象与其副本次数之间的相互影响。
Python 中的深拷贝与浅拷贝
Python同样支持两种不同的对象复制机制——浅拷贝和深拷贝。为了更好地理解和区分这两者,在这里提供具体的例子说明其工作原理。
使用 copy.copy()
实现浅拷贝
当使用内置模块copy
下的函数copy()
来进行浅拷贝时,只会在顶层容器级别上创建新的实体;而对于其中包含的任何可变数据项(比如列表、字典),则依旧保持原有的引用关系[^3]。
from copy import copy
original_list = [[1], [2]]
shallow_copied_list = copy(original_list)
print(shallow_copied_list is original_list) # False
print(shallow_copied_list[0] is original_list[0]) # True
此示例表明虽然外部列表已经被成功复制,但内部的小列表仍然指向相同的内存位置。
使用 copy.deepcopy()
进行完全隔离的深拷贝
要真正意义上获得一个全新且独立的对象树形结构,应该采用deepcopy()
函数。这将遍历整个对象图谱直至叶子节点处逐一建立新的实例,最终达到绝对意义上的分离效果[^4]。
from copy import deepcopy
original_dict = {"key": ["value"]}
deep_copied_dict = deepcopy(original_dict)
print(deep_copied_dict is original_dict) # False
print(deep_copied_dict["key"] is original_dict["key"]) # False
通过这种方式,无论是顶级还是底层的数据都被完整无误地重建出来,使得修改任意一方都不会波及另一方。
相关推荐

















