溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java集合深拷貝淺拷貝

發(fā)布時間:2024-09-28 15:34:28 來源:億速云 閱讀:81 作者:小樊 欄目:編程語言

在Java中,對象的拷貝可以分為兩種:淺拷貝(Shallow Copy)和深拷貝(Deep Copy)。這兩種拷貝方式的主要區(qū)別在于它們處理對象內(nèi)部引用類型字段的方式。

  1. 淺拷貝(Shallow Copy): 淺拷貝創(chuàng)建一個新對象,這個新對象有著和原始對象完全相同的值(對于基本數(shù)據(jù)類型)或者引用(對于引用數(shù)據(jù)類型)。換句話說,如果字段是基本數(shù)據(jù)類型,則直接復(fù)制其值;如果字段是引用數(shù)據(jù)類型,則復(fù)制的是引用,而不是對象本身。這意味著,如果原始對象中的引用數(shù)據(jù)類型字段指向的對象發(fā)生變化,那么淺拷貝后的對象中的對應(yīng)字段也會受到影響。

在Java中,可以通過以下方式實現(xiàn)淺拷貝:

  • 使用對象的拷貝構(gòu)造函數(shù)。
  • 使用clone()方法(前提是實現(xiàn)了Cloneable接口)。

示例:

class ShallowCopyExample implements Cloneable {
    int value;
    List<String> list;

    public ShallowCopyExample(int value, List<String> list) {
        this.value = value;
        this.list = list;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

// 創(chuàng)建一個對象
ShallowCopyExample original = new ShallowCopyExample(1, new ArrayList<>(Arrays.asList("A", "B")));

// 創(chuàng)建一個淺拷貝
ShallowCopyExample copy = (ShallowCopyExample) original.clone();

// 修改原始對象的list
original.list.add("C");

// 輸出原始對象和拷貝對象的list
System.out.println(original.list); // 輸出:[A, B, C]
System.out.println(copy.list); // 輸出:[A, B]
  1. 深拷貝(Deep Copy): 深拷貝創(chuàng)建一個新對象,并遞歸地復(fù)制原始對象中的所有字段。對于基本數(shù)據(jù)類型,直接復(fù)制其值;對于引用數(shù)據(jù)類型,復(fù)制的是對象本身,而不是引用。這意味著,即使原始對象中的引用數(shù)據(jù)類型字段指向的對象發(fā)生變化,深拷貝后的對象中的對應(yīng)字段也不會受到影響。

在Java中,可以通過以下方式實現(xiàn)深拷貝:

  • 使用序列化和反序列化的方式。首先將對象序列化為字節(jié)數(shù)組,然后再將字節(jié)數(shù)組反序列化為一個新的對象。

示例:

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class DeepCopyExample implements Serializable {
    int value;
    List<String> list;

    public DeepCopyExample(int value, List<String> list) {
        this.value = value;
        this.list = list;
    }
}

public class DeepCopyExampleDemo {
    public static <T extends Serializable> T deepCopy(T obj) {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(obj);

            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bais);
            return (T) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            throw new RuntimeException("Deep copy failed", e);
        }
    }

    public static void main(String[] args) {
        // 創(chuàng)建一個對象
        DeepCopyExample original = new DeepCopyExample(1, new ArrayList<>(Arrays.asList("A", "B")));

        // 創(chuàng)建一個深拷貝
        DeepCopyExample copy = deepCopy(original);

        // 修改原始對象的list
        original.list.add("C");

        // 輸出原始對象和拷貝對象的list
        System.out.println(original.list); // 輸出:[A, B, C]
        System.out.println(copy.list); // 輸出:[A, B]
    }
}

總結(jié):淺拷貝只復(fù)制對象的引用,而深拷貝會遞歸地復(fù)制對象及其內(nèi)部的所有對象。在實際應(yīng)用中,根據(jù)需求選擇合適的拷貝方式。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI