温馨提示×

java深拷贝和浅拷贝怎么实现

小亿
86
2024-01-06 02:17:42
栏目: 编程语言

在Java中,深拷贝和浅拷贝可以通过不同的方式实现。

  1. 浅拷贝:浅拷贝是指在拷贝对象时,只复制对象的引用,而不复制对象本身。当对其中一个对象进行修改时,另一个对象也会受到影响。

    使用以下方式实现浅拷贝:

    • 实现Cloneable接口,并重写clone()方法。在clone()方法中,调用父类的clone()方法,然后返回拷贝后的对象。
      public class MyClass implements Cloneable {
          private int value;
          
          public MyClass(int value) {
              this.value = value;
          }
          
          @Override
          protected Object clone() throws CloneNotSupportedException {
              return super.clone();
          }
      }
      
    • 使用copy方法进行拷贝。例如,可以使用Arrays.copyOf()System.arraycopy()进行数组的浅拷贝。
      int[] array1 = {1, 2, 3};
      int[] array2 = Arrays.copyOf(array1, array1.length);
      
  2. 深拷贝:深拷贝是指在拷贝对象时,不仅复制对象的引用,还复制对象本身及其所有引用的对象。这样,在拷贝后的对象上进行修改不会影响原始对象。

    使用以下方式实现深拷贝:

    • 实现Serializable接口,并使用序列化和反序列化实现深拷贝。
      import java.io.*;
      
      public class MyClass implements Serializable {
          private int value;
          
          public MyClass(int value) {
              this.value = value;
          }
          
          public MyClass deepCopy() throws IOException, ClassNotFoundException {
              ByteArrayOutputStream baos = new ByteArrayOutputStream();
              ObjectOutputStream oos = new ObjectOutputStream(baos);
              oos.writeObject(this);
              oos.close();
              
              ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
              ObjectInputStream ois = new ObjectInputStream(bais);
              MyClass copy = (MyClass) ois.readObject();
              ois.close();
              
              return copy;
          }
      }
      
    • 使用第三方库,如Apache Commons Lang中的SerializationUtils.clone()方法进行深拷贝。
      MyClass copy = SerializationUtils.clone(original);
      

需要注意的是,要使对象可以被拷贝,必须满足以下条件之一:

  • 对象实现Cloneable接口并重写clone()方法。
  • 对象实现Serializable接口。
  • 使用第三方库提供的深拷贝方法。

0