最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中淺拷貝和深拷貝詳解

 更新時間:2021年12月06日 16:25:14   作者:Ccy丶雙  
大家好,本篇文章主要講的是Java中淺拷貝和深拷貝詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽

Java淺拷貝深拷貝

淺拷貝和深拷貝涉及到了Object類中的clone()方法

在這里插入圖片描述

實現(xiàn)淺拷貝

淺拷貝的實現(xiàn)需要類重寫clone()方法

淺拷貝會創(chuàng)建一個新對象,這個對象有著原始對象屬性值的一份精確拷貝

如果屬性是基本類型,拷貝的就是基本類型的值;

如果屬性是內(nèi)存地址(引用類型),拷貝的就是內(nèi)存地址 ,因此如果其中一個對象改變了這個地址,就會影響到另一個對象,導(dǎo)致兩個對象的引用不等。

實現(xiàn)淺拷貝很簡單只需要將類實現(xiàn)Cloneable接口然后重寫clone方法即可

class Person implements Cloneable {
    String name;
    int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    /**
         * 重寫clone()方法
         *
         * @return
         * @throws CloneNotSupportedException
         */
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    @Override
    public String toString() {
        return "Person{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
    }
}

測試淺拷貝特性

public void testClone() throws CloneNotSupportedException {
    Person person1 = new Person();
    person1.setName("ccy");
    person1.setAge(20);
    Person person2 = (Person) person1.clone();
    //查看淺拷貝效果
    System.out.println(person1);
    System.out.println(person2);
    System.out.println(person1.getName() == person2.getName());
    //驗證clone()的特性
    System.out.println(person1.clone() != person1);
    System.out.println(person1.clone().getClass() == person1.getClass());
    //如果是基本類型淺拷貝直接賦值值,如果是引用類型淺拷貝指向其內(nèi)存地址即共享內(nèi)存地址
    //改變person1的引用類型String屬性的值,引用發(fā)生改變
    person1.setName("zfs");
    System.out.println(person2.getName());
}

在這里插入圖片描述

實現(xiàn)深拷貝

對于上述的問題雖然拷貝的兩個對象不同,但其內(nèi)部的一些引用還是相同的,怎么樣絕對的拷貝這個對象,使這個對象完全獨立于原對象呢?就使用我們的深拷貝了。深拷貝:在對引用數(shù)據(jù)類型進(jìn)行拷貝的時候,創(chuàng)建了一個新的對象,并且復(fù)制其內(nèi)的成員變量。

在具體實現(xiàn)深拷貝上,這里提供兩個方式,重寫clone()方法和序列法。

重寫clone()方法

如果使用重寫clone()方法實現(xiàn)深拷貝,那么要將類中所有自定義引用變量的類也去實現(xiàn)Cloneable接口實現(xiàn)clone()方法。對于字符類可以創(chuàng)建一個新的字符串實現(xiàn)拷貝。但是對于自定義類需要實現(xiàn)cloneable重寫clone,這樣做就太麻煩了所以我們使用序列化

序列化

序列化后將二進(jìn)制字節(jié)流內(nèi)容寫到一個媒介(文本或字節(jié)數(shù)組),然后是從這個媒介讀取數(shù)據(jù),原對象寫入這個媒介后拷貝給clone對象,原對象的修改不會影響clone對象,因為clone對象是從這個媒介讀取。

熟悉對象緩存的知道我們經(jīng)常將Java對象緩存到Redis中,然后還可能從Redis中讀取生成Java對象,這就用到序列化和反序列化。一般可以將Java對象存儲為字節(jié)流或者json串然后反序列化成Java對象。因為序列化會儲存對象的屬性但是不會也無法存儲對象在內(nèi)存中地址相關(guān)信息。所以在反序列化成Java對象時候會重新創(chuàng)建所有的引用對象。

在具體實現(xiàn)上,自定義的類需要實現(xiàn)Serializable接口

class Person implements Serializable {
    String name;
    int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
    }

    protected Person deepClone() throws Exception {
        //序列化
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);

        oos.writeObject(this);

        //反序列化
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);

        return (Person) ois.readObject();
    }
}

測試方法

public void testClone() throws Exception {
    Person person1 = new Person();
    person1.setName("ccy");
    person1.setAge(20);
    Person person2 = person1.deepClone();
    System.out.println(person1.getName() == person2.getName());
}

在這里插入圖片描述

可以看到兩個引用對象的地址并不同,成功實現(xiàn)了深拷貝

到此這篇關(guān)于Java中淺拷貝和深拷貝詳解的文章就介紹到這了,更多相關(guān)Java淺拷貝深拷貝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis plus使用redis作為二級緩存的方法

    mybatis plus使用redis作為二級緩存的方法

    這篇文章主要介紹了mybatis plus使用redis作為二級緩存的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • 深入了解Java設(shè)計模式之職責(zé)鏈模式

    深入了解Java設(shè)計模式之職責(zé)鏈模式

    Java設(shè)計模式中有很多種類別,例如單例模式、裝飾模式、觀察者模式等。本文將為大家詳細(xì)介紹其中的職責(zé)鏈模式,感興趣的可以了解一下
    2022-09-09
  • Mybatis查詢返回兩個或多個參數(shù)問題

    Mybatis查詢返回兩個或多個參數(shù)問題

    這篇文章主要介紹了Mybatis查詢返回兩個或多個參數(shù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • SpringBoot同時啟動不同端口圖示解析

    SpringBoot同時啟動不同端口圖示解析

    這篇文章主要介紹了SpringBoot同時啟動不同端口圖示解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • Springcloud中Feign傳遞參數(shù)的過程解析

    Springcloud中Feign傳遞參數(shù)的過程解析

    這篇文章主要介紹了Springcloud中Feign傳遞參數(shù)的過程,單個參數(shù)的傳值有兩種方式,第一種使用@RequestParam/@PathVariable進(jìn)行傳值,傳遞多個參數(shù):多個參數(shù)的傳值可以使用多個@RequestParam來進(jìn)行傳參,需要的朋友可以參考下
    2023-09-09
  • Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type異常

    Caused by: java.lang.ClassNotFoundException: org.objectweb.a

    這篇文章主要介紹了Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type異常,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • java開發(fā)中遇到的異常匯總詳解

    java開發(fā)中遇到的異常匯總詳解

    這篇文章主要介紹了java開發(fā)中遇到的異常匯總詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • IDEA消除指定警告的兩種方法小結(jié)

    IDEA消除指定警告的兩種方法小結(jié)

    有時候IDEA會代碼中給出一些我們不需要的警告,看起來就很不美觀,本文主要介紹了IDEA消除指定警告的兩種方法,感興趣的可以了解一下
    2023-08-08
  • SpringBoot生成License的實現(xiàn)示例

    SpringBoot生成License的實現(xiàn)示例

    License指的是版權(quán)許可證,那么對于SpringBoot項目,如何增加License呢?本文就來介紹一下,感興趣的可以了解一下
    2021-06-06
  • 解讀為什么@Autowired在屬性上被警告,在setter方法上不被警告問題

    解讀為什么@Autowired在屬性上被警告,在setter方法上不被警告問題

    在Spring開發(fā)中,@Autowired注解常用于實現(xiàn)依賴注入,它可以應(yīng)用于類的屬性、構(gòu)造器或setter方法上,然而,當(dāng)@Autowired注解在屬性上使用時,IntelliJIDEA等IDE會給出Fieldinjectionisnotrecommended的警告,而在setter方法上使用@Autowired時卻不會出現(xiàn)這個警告
    2025-02-02

最新評論

穆棱市| 铁力市| 扶风县| 澄江县| 东阿县| 梧州市| 东安县| 莒南县| 清远市| 兖州市| 平塘县| 玛曲县| 时尚| 松桃| 武义县| 垦利县| 韶山市| 洪洞县| 琼中| 安西县| 辽阳县| 绵阳市| 吉首市| 凤阳县| 贵德县| 海南省| 辽中县| 夏河县| 嘉善县| 大名县| 安丘市| 宣威市| 灯塔市| 稻城县| 富阳市| 绿春县| 宁海县| 东兴市| 酒泉市| 准格尔旗| 广州市|