欢迎访问宙启技术站
智能推送

Java函数:如何实现对象的深拷贝?

发布时间:2023-07-06 09:43:01

在Java中,对象的深拷贝是指创建一个全新的对象,并将原始对象的所有属性值都复制给新对象。实现对象的深拷贝的方法有以下几种:

1. 覆写clone()方法:Java提供了一个Cloneable接口,该接口标识着该类可以被拷贝,但是该接口本身没有提供拷贝功能,需要在类中覆写clone()方法。在clone()方法中,首先调用super.clone()方法创建一个新的对象,然后将原始对象的属性值复制给新对象的对应属性。注意,该方法只能实现浅拷贝,即如果对象中的属性存在引用类型,拷贝后的对象和原始对象将共享该引用类型对象。

示例代码:

public class MyClass implements Cloneable {
  private int num;
  private String str;

  @Override
  public MyClass clone() throws CloneNotSupportedException {
    return (MyClass) super.clone();
  }

  // getters and setters
}

使用示例:

MyClass obj1 = new MyClass();
obj1.setNum(1);
obj1.setStr("Hello");

MyClass obj2 = obj1.clone();

System.out.println(obj2.getNum());  // 输出:1
System.out.println(obj2.getStr());  // 输出:Hello

2. 序列化与反序列化:通过将对象序列化为字节流,然后通过反序列化重建对象来实现对象的深拷贝。要实现该方法,对象所属的类必须实现Serializable接口。

示例代码:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class MyClass implements Serializable {
  private int num;
  private String str;

  public MyClass deepCopy() {
    try {
      ByteArrayOutputStream bos = new ByteArrayOutputStream();
      ObjectOutputStream oos = new ObjectOutputStream(bos);
      oos.writeObject(this);
      oos.close();

      ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
      ObjectInputStream ois = new ObjectInputStream(bis);
      
      MyClass copy = (MyClass) ois.readObject();
      ois.close();
      
      return copy;
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }
  }

  // getters and setters
}

使用示例:

MyClass obj1 = new MyClass();
obj1.setNum(1);
obj1.setStr("Hello");

MyClass obj2 = obj1.deepCopy();

System.out.println(obj2.getNum());  // 输出:1
System.out.println(obj2.getStr());  // 输出:Hello

3. 利用工具类:使用一些工具类来实现对象的深拷贝,例如Apache Commons的SerializationUtils和BeanUtils,或者Spring Framework的BeanUtils。

示例代码(使用Apache Commons的SerializationUtils):

import org.apache.commons.lang3.SerializationUtils;

public class MyClass {
  private int num;
  private String str;

  public MyClass deepCopy() {
    return SerializationUtils.clone(this);
  }

  // getters and setters
}

使用示例:

MyClass obj1 = new MyClass();
obj1.setNum(1);
obj1.setStr("Hello");

MyClass obj2 = obj1.deepCopy();

System.out.println(obj2.getNum());  // 输出:1
System.out.println(obj2.getStr());  // 输出:Hello

总结:对象的深拷贝是在拷贝对象时创建一个全新的对象,并将原始对象的所有属性值都复制给新对象。实现对象的深拷贝的方法有覆写clone()方法、序列化与反序列化以及利用工具类。这些方法都可以实现对象的深拷贝,根据具体的需求和场景选择适合的方法。