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

avatar
作者
猴君
阅读量:1

在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接口。
  • 使用第三方库提供的深拷贝方法。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!