JAVA 深层拷贝 DeepCopy的使用详解
什么是深度拷贝?
在JAVA中,如果需要拷贝一个对象,可以使用浅拷贝shallow copy方法。这种方法只是复制了一个引用,当对原始对象进行修改时,复制对象也会发生相应的修改。这是因为原始对象和复制对象只是引用同一地址。而深度拷贝就是完全的副本,不仅对象本身被复制,对象内部的变量和引用同样被复制。
深层拷贝的实现方法
深度拷贝有多种实现方法,包括:
- 使用Cloneable接口和Clone方法
- 使用序列化实现深拷贝
- 使用Apache Commons Lang库中的SerializationUtils类
接下来我们将使用第一种方法实现深度拷贝。
使用Cloneable接口和Clone方法实现深拷贝
首先,要使用Cloneable接口和Clone方法,需要在我们需要拷贝的类中实现Cloneable接口,并重写clone
方法。在clone
方法中,需要先调用super.clone()
方法创建对象的一个浅拷贝,然后再递归地进行深拷贝。
下面是一个示例:
public class MyClass implements Cloneable {
private String name;
private MyObj myObj;
public MyClass(String name, MyObj myObj) {
this.name = name;
this.myObj = myObj;
}
@Override
public MyClass clone() throws CloneNotSupportedException {
MyClass newObj = (MyClass) super.clone();
newObj.myObj = this.myObj.clone();
return newObj;
}
}
public class MyObj implements Cloneable {
private int value;
public MyObj(int value) {
this.value = value;
}
@Override
public MyObj clone() throws CloneNotSupportedException {
return (MyObj) super.clone();
}
}
在上面的示例中,MyClass
包含了一个MyObj
类型成员变量,并且在clone
方法中递归进行了深拷贝。
现在,我们来看看如何使用这种方法进行深度拷贝:
MyClass myObj = new MyClass("obj1", new MyObj(10));
MyClass myObj2 = myObj.clone();
执行以上代码后,myObj2
就是myObj
的深度拷贝。
使用序列化实现深拷贝
第二种方法是使用序列化来实现深拷贝。
Java中所有实现了Serializable接口的类都可以被序列化,将对象序列化成二进制流,再通过反序列化将其还原成对象。这种方法比较简单,但是效率较低,因为序列化和反序列化是比较耗时的操作。
下面是一个使用序列化实现深拷贝的示例:
public static <T extends Serializable> T clone(T obj) throws IOException, ClassNotFoundException {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bout);
oos.writeObject(obj);
ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bin);
return (T) ois.readObject();
}
以上方法的参数为需要深拷贝的对象,通过将此对象序列化,再通过反序列化得到拷贝对象。
使用以上方法进行深拷贝的示例:
MyClass myObj = new MyClass("obj1", new MyObj(10));
MyClass myObj2 = clone(myObj);
执行以上代码后,myObj2
就是myObj
的深度拷贝。
总结
在JAVA中,深度拷贝是非常常见的需求,实现深拷贝的方法有多种。本文主要介绍了使用Cloneable接口和Clone方法以及序列化来实现深拷贝的方法。
在以上示例中,我们对MyClass
进行了深度拷贝,并包含了一个成员变量MyObj
。使用以上方法进行深拷贝时,也可以对多层嵌套的对象进行深度拷贝,只需要在各自对象的类中重写clone
方法或使用序列化即可。
以上就是本篇文章对“JAVA 深层拷贝 DeepCopy的使用详解”的介绍。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA 深层拷贝 DeepCopy的使用详解 - Python技术站