Java之深淺拷貝

Java之深淺拷貝

基本類型:拷貝數(shù)據(jù)的值
其他類型:拷貝地址的引用伍伤,拷貝出的新對(duì)象與原對(duì)象共享實(shí)例變量并徘,不受訪問(wèn)權(quán)限影響
String類型:拷貝的也是一個(gè)引用,但其內(nèi)容存儲(chǔ)在字符串池中扰魂,修改時(shí)會(huì)重新生成新的字符串麦乞,原有字符串內(nèi)容是保持不變的(String是不可變的),等同于基本類型劝评。

淺拷貝

淺拷貝就是直接使用"="給基本類型賦值(即使拷貝引用)

List<String> srcList = new ArrayList<>();
srcList.add("android");
List<String> cpyList = srcList;
srcList.add("ios");

輸出這兩個(gè)list姐直,srcList和cpyList都有android,ios兩項(xiàng)蒋畜。

深拷貝

深拷貝就是將所有屬性均拷貝到另外一個(gè)對(duì)象中声畏,將其中任何一個(gè)對(duì)象的任何一個(gè)屬性發(fā)生變化時(shí),另外一個(gè)對(duì)象不受任何影響姻成。

List<String> srcList = new ArrayList<>();
srcList.add("android");
List<String> cpyList = new ArrayList<>(srcList);
srcList.add("ios");

輸出這兩個(gè)list插龄,srcList有android,ios兩項(xiàng)科展,而cpyList只有android一項(xiàng)均牢。

clone方法實(shí)現(xiàn)拷貝

每個(gè)對(duì)象都是繼承于Object類的,Object類提供了clone方法才睹,通過(guò)實(shí)現(xiàn)Cloneable接口可以使該具有拷貝的能力徘跪,拷貝的操作是在內(nèi)存中進(jìn)行中,所以性能會(huì)比直接構(gòu)造對(duì)象要快速很多琅攘。

public class Student implements Cloneable {
    private String name;
    private Teacher teacher;

    public String getName() {
        return name;
    }

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

    public Teacher getTeacher() {
        return teacher;
    }

    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }

    @Override
    protected Student clone() {
        Student s = null;
        try {
            s = (Student) super.clone();
            s.setTeacher(s.getTeacher());
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return s;
    }

    public static void main(String[] args) {
        Student s1 = new Student();
        s1.setName("Yao");
        s1.setTeacher(new Teacher("Kobe"));
        Student s2 = s1.clone();
        s2.setName("Yi");
        s2.getTeacher().setName("Jordan");
        System.out.println(s1.getName() + "'s teacher is "
                + s1.getTeacher().getName());
        System.out.println(s2.getName() + "'s teacher is "
                + s2.getTeacher().getName());

    }
}

class Teacher {
    private String name;

    public String getName() {
        return name;
    }

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

    public Teacher(String name) {
        super();
        this.name = name;
    }
}

輸出:
Yao's teacher is Jordan
Yi's teacher is Jordan
這里關(guān)于teacher的拷貝是通過(guò)"="號(hào)來(lái)操作的真椿,僅僅實(shí)現(xiàn)了淺拷貝。

@Override
protected Student clone() {
    Student s = null;
    try {
        s = (Student) super.clone();
        s.setTeacher(new Teacher(s.getTeacher().getName()));
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
    }
    return s;
}

將Student類的clone方法改成這樣即可實(shí)現(xiàn)深拷貝乎澄。
輸出:
Yao's teacher is Kobe
Yi's teacher is Jordan

通過(guò)對(duì)象序列化,使用writeObject和readObject也可以實(shí)現(xiàn)對(duì)象的深拷貝测摔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末置济,一起剝皮案震驚了整個(gè)濱河市解恰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌浙于,老刑警劉巖护盈,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異羞酗,居然都是意外死亡腐宋,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門檀轨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)胸竞,“玉大人,你說(shuō)我怎么就攤上這事参萄∥乐Γ” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵讹挎,是天一觀的道長(zhǎng)校赤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)筒溃,這世上最難降的妖魔是什么马篮? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮怜奖,結(jié)果婚禮上浑测,老公的妹妹穿的比我還像新娘。我一直安慰自己烦周,他們只是感情好尽爆,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著读慎,像睡著了一般漱贱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夭委,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天幅狮,我揣著相機(jī)與錄音,去河邊找鬼株灸。 笑死崇摄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的慌烧。 我是一名探鬼主播逐抑,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼屹蚊!你這毒婦竟也來(lái)了厕氨?” 一聲冷哼從身側(cè)響起进每,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎命斧,沒想到半個(gè)月后田晚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡国葬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年贤徒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汇四。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡接奈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出船殉,到底是詐尸還是另有隱情鲫趁,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布利虫,位于F島的核電站挨厚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏糠惫。R本人自食惡果不足惜疫剃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望硼讽。 院中可真熱鬧巢价,春花似錦、人聲如沸固阁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)备燃。三九已至碉克,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間并齐,已是汗流浹背漏麦。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留况褪,地道東北人撕贞。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像测垛,于是被迫代替她去往敵國(guó)和親捏膨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法食侮,類相關(guān)的語(yǔ)法号涯,內(nèi)部類的語(yǔ)法熬北,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法诚隙,線程的語(yǔ)...
    子非魚_t_閱讀 31,665評(píng)論 18 399
  • 對(duì)象的創(chuàng)建與銷毀 Item 1: 使用static工廠方法,而不是構(gòu)造函數(shù)創(chuàng)建對(duì)象:僅僅是創(chuàng)建對(duì)象的方法起胰,并非Fa...
    孫小磊閱讀 1,996評(píng)論 0 3
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 11,010評(píng)論 6 13
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,815評(píng)論 0 11
  • 這一年效五,我愿意接受很多東西… 比如說(shuō): 那久違的奮斗路上彼此珍視的伙伴慢慢回來(lái)地消。這在以前我鐵定不...
    天思靜默閱讀 309評(píng)論 2 11