JAVA 深层拷贝 DeepCopy的使用详解

在JAVA中,如果需要拷贝一个对象,可以使用浅拷贝shallow copy方法。这种方法只是复制了一个引用,当对原始对象进行修改时,复制对象也会发生相应的修改。这是因为原始对象和复制对象只是引用同一地址。而深度拷贝就是完全的副本,不仅对象

JAVA 深层拷贝 DeepCopy的使用详解

什么是深度拷贝?

在JAVA中,如果需要拷贝一个对象,可以使用浅拷贝shallow copy方法。这种方法只是复制了一个引用,当对原始对象进行修改时,复制对象也会发生相应的修改。这是因为原始对象和复制对象只是引用同一地址。而深度拷贝就是完全的副本,不仅对象本身被复制,对象内部的变量和引用同样被复制。

深层拷贝的实现方法

深度拷贝有多种实现方法,包括:

  1. 使用Cloneable接口和Clone方法
  2. 使用序列化实现深拷贝
  3. 使用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的使用详解

基础教程推荐