Java中关于深拷贝的几种方式总结
什么是深拷贝
在Java中,当我们复制一个对象时,有两种不同的方式,即浅拷贝和深拷贝。浅拷贝仅复制对象的引用,而深拷贝是将整个对象及其内部所有的引用类型都复制一份,不会影响原对象。在某些情景下,我们可能需要使用深拷贝来保证数据的完整性和正确性。
Java中深拷贝的几种方式
1.使用ObjectInputStream/ObjectOutputStream实现深拷贝
使用ObjectInputStream
和ObjectOutputStream
类可以方便地实现深拷贝,只需要将要复制的对象先输出到一个字节流中,然后再从字节流中读取出来即可。代码示例:
import java.io.*;
public class DeepCopyWithSerialization {
public static void main(String[] args) throws Exception {
//原始对象
TestObj obj1 = new TestObj();
obj1.setName("张三");
//输出流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
//写入字节数组流
oos.writeObject(obj1);
//输入流
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
//读取字节数组流
TestObj obj2 = (TestObj) ois.readObject();
//判断两个对象是否相同
System.out.println(obj1 == obj2); //false
System.out.println(obj1.getName().equals(obj2.getName())); //true
}
}
class TestObj implements Serializable {
private static final long serialVersionUID = 1L; //版本号
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.使用clone方法实现深拷贝
Java中的clone()
方法支持对象的复制,但默认仅实现了浅拷贝。如果要实现深拷贝,需要将对象实现Cloneable
接口,并重写clone()
方法。在clone()
方法内部,将对象及其内部所有属性全部复制一份即可。代码示例:
public class DeepCopyWithClone {
public static void main(String[] args) throws CloneNotSupportedException {
//原始对象
TestPerson p1 = new TestPerson("张三", new TestBook("Java从入门到精通"));
//复制对象
TestPerson p2 = (TestPerson) p1.clone();
//判断两个对象是否相同
System.out.println(p1 == p2); //false
System.out.println(p1.getBook() == p2.getBook()); //false,说明成功进行了深拷贝
}
}
class TestPerson implements Cloneable {
private String name;
private TestBook book;
public TestPerson(String name, TestBook book) {
this.name = name;
this.book = book;
}
public TestBook getBook() {
return book;
}
public void setBook(TestBook book) {
this.book = book;
}
@Override
protected Object clone() throws CloneNotSupportedException {
TestPerson person = (TestPerson) super.clone(); //浅拷贝
person.book = (TestBook) book.clone(); //深拷贝
return person;
}
}
class TestBook implements Cloneable {
private String name;
public TestBook(String name) {
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); //默认浅拷贝即可
}
}
总结
在Java中实现深拷贝的方式有多种,每种方式都有其优缺点,适用于不同的场景。需要根据具体情况选择合适的方式来保证数据的完整性和正确性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java中关于深拷贝的几种方式总结 - Python技术站