java深拷貝和淺拷貝怎么實(shí)現(xiàn)

小億
86
2024-01-06 02:17:42

在Java中,深拷貝和淺拷貝可以通過(guò)不同的方式實(shí)現(xiàn)。

  1. 淺拷貝:淺拷貝是指在拷貝對(duì)象時(shí),只復(fù)制對(duì)象的引用,而不復(fù)制對(duì)象本身。當(dāng)對(duì)其中一個(gè)對(duì)象進(jìn)行修改時(shí),另一個(gè)對(duì)象也會(huì)受到影響。

    使用以下方式實(shí)現(xiàn)淺拷貝:

    • 實(shí)現(xiàn)Cloneable接口,并重寫(xiě)clone()方法。在clone()方法中,調(diào)用父類(lèi)的clone()方法,然后返回拷貝后的對(duì)象。
      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方法進(jìn)行拷貝。例如,可以使用Arrays.copyOf()System.arraycopy()進(jìn)行數(shù)組的淺拷貝。
      int[] array1 = {1, 2, 3};
      int[] array2 = Arrays.copyOf(array1, array1.length);
      
  2. 深拷貝:深拷貝是指在拷貝對(duì)象時(shí),不僅復(fù)制對(duì)象的引用,還復(fù)制對(duì)象本身及其所有引用的對(duì)象。這樣,在拷貝后的對(duì)象上進(jìn)行修改不會(huì)影響原始對(duì)象。

    使用以下方式實(shí)現(xiàn)深拷貝:

    • 實(shí)現(xiàn)Serializable接口,并使用序列化和反序列化實(shí)現(xiàn)深拷貝。
      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;
          }
      }
      
    • 使用第三方庫(kù),如Apache Commons Lang中的SerializationUtils.clone()方法進(jìn)行深拷貝。
      MyClass copy = SerializationUtils.clone(original);
      

需要注意的是,要使對(duì)象可以被拷貝,必須滿(mǎn)足以下條件之一:

  • 對(duì)象實(shí)現(xiàn)Cloneable接口并重寫(xiě)clone()方法。
  • 對(duì)象實(shí)現(xiàn)Serializable接口。
  • 使用第三方庫(kù)提供的深拷貝方法。

0