溫馨提示×

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

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

原型模式在Java實(shí)現(xiàn)深拷貝與淺拷貝的區(qū)別

發(fā)布時(shí)間:2024-09-29 12:20:29 來源:億速云 閱讀:81 作者:小樊 欄目:編程語言

原型模式(Prototype Pattern)是一種創(chuàng)建型設(shè)計(jì)模式,它允許通過復(fù)制(或克?。┮粋€(gè)現(xiàn)有對(duì)象來創(chuàng)建一個(gè)新對(duì)象,而無需重新實(shí)例化它。這種模式在Java中可以通過實(shí)現(xiàn)Cloneable接口和重寫clone()方法來實(shí)現(xiàn)深拷貝(Deep Copy)和淺拷貝(Shallow Copy)。

  1. 淺拷貝(Shallow Copy)

    • 淺拷貝創(chuàng)建一個(gè)新對(duì)象,這個(gè)新對(duì)象有著原始對(duì)象值的一份精確拷貝。如果拷貝的是基本數(shù)據(jù)類型,則直接拷貝其值;如果拷貝的是引用類型,則拷貝的是引用,即新對(duì)象和原始對(duì)象的引用指向的是同一個(gè)內(nèi)存地址。
    • 在Java中,可以通過實(shí)現(xiàn)Cloneable接口并重寫clone()方法來實(shí)現(xiàn)淺拷貝。但需要注意的是,clone()方法默認(rèn)執(zhí)行的是淺拷貝,需要開發(fā)者手動(dòng)實(shí)現(xiàn)深拷貝邏輯。
    • 例如:
public class ShallowCopyExample implements Cloneable {
    private int[] data;

    public ShallowCopyExample(int[] data) {
        this.data = data;
    }

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

在這個(gè)例子中,ShallowCopyExample類實(shí)現(xiàn)了Cloneable接口并重寫了clone()方法。但是,由于data字段是一個(gè)數(shù)組,它仍然指向同一個(gè)內(nèi)存地址,因此執(zhí)行的是淺拷貝。 2. 深拷貝(Deep Copy)

* 深拷貝創(chuàng)建一個(gè)新對(duì)象,并遞歸地拷貝原始對(duì)象中的所有引用類型字段。這意味著新對(duì)象和原始對(duì)象的引用類型字段將指向不同的內(nèi)存地址。
* 在Java中,實(shí)現(xiàn)深拷貝通常需要自定義拷貝邏輯,而不是簡單地重寫`clone()`方法??梢酝ㄟ^序列化和反序列化的方式來實(shí)現(xiàn)深拷貝,因?yàn)樾蛄谢瘯?huì)創(chuàng)建對(duì)象的深度副本。
* 例如:
public class DeepCopyExample implements Serializable {
    private int[] data;

    public DeepCopyExample(int[] data) {
        this.data = data;
    }

    public DeepCopyExample deepCopy() {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(this);

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

在這個(gè)例子中,DeepCopyExample類實(shí)現(xiàn)了Serializable接口,并重寫了一個(gè)deepCopy()方法。這個(gè)方法使用序列化和反序列化的技術(shù)來創(chuàng)建對(duì)象的深度副本。

總結(jié):

  • 淺拷貝只復(fù)制對(duì)象本身和其中基本數(shù)據(jù)類型的值,而引用類型的字段仍然指向同一個(gè)內(nèi)存地址。
  • 深拷貝遞歸地復(fù)制對(duì)象本身和其中所有引用類型字段的值,使得新對(duì)象和原始對(duì)象的引用類型字段指向不同的內(nèi)存地址。
  • 在Java中,可以通過實(shí)現(xiàn)Cloneable接口并重寫clone()方法來實(shí)現(xiàn)淺拷貝;通過序列化和反序列化的方式來實(shí)現(xiàn)深拷貝。
向AI問一下細(xì)節(jié)

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

AI