java深拷貝與淺拷貝

2021-08-29 17:23:39 字數 1764 閱讀 9628

//淺拷貝與深拷貝

//淺拷貝:被複製物件的所有變數都含有與原來的物件相同的值,而所有的對其他物件的引用仍然指向原來的物件。

//換言之,淺複製僅僅複製所考慮的物件,而不複製它所引用的物件。

//深拷貝:被複製物件的所有變數都含有與原來的物件相同的值,除去那些引用其他物件的變數。

//那些引用其他物件的變數將指向被複製過的新物件,而不再是原有的那些被引用的物件。

//換言之,深複製把要複製的物件所引用的物件都複製了一遍。

//1、直接賦值(字串外都屬於淺拷貝)

//2、使用建構函式(深拷貝)

//3、使用clone()方法(深拷貝)

//字串(不理解無colne()方法)

string s="sss";

string t=s; //深拷貝

string y=new string(s); //深拷貝

system.out.println("s:"+s+" t:"+t+" y:"+y);

t="ttt";

y="yyy";

system.out.println("s:"+s+" t:"+t+" y:"+y);

//陣列

string ss=;

string tt=ss; //淺拷貝

string ww=(string)ss.clone();//深拷貝

system.out.println("ss:"+ss[1]+" tt:"+tt[1]+" ww:"+ww[1]);

tt[1]="2t2";

ww[1]="2w2";

system.out.println("ss:"+ss[1]+" tt:"+tt[1]+" ww:"+ww[1]);

//list列表

arraylist a=new arraylist();

for(int i=0;i<10;i++)

arraylist b=a;//淺拷貝

arraylist c=new arraylist(a);//深拷貝

arraylist d=(arraylist)a.clone();//深拷貝

system.out.println("a:"+a.get(1)+" b:"+b.get(1)+" c:"+c.get(1)+" d:"+d.get(1));

b.set(1, "bbb");

c.set(1, "ccc");

system.out.println("a:"+a.get(1)+" b:"+b.get(1)+" c:"+c.get(1)+" d:"+d.get(1));

//hashmap

hashmap h=new hashmap();

h.put("1", "hhh");

hashmap m=h;//淺拷貝

hashmap p=new hashmap(h);//深拷貝

hashmap n=(hashmap)h.clone();//深拷貝

system.out.println("h:"+h.get("1")+" m:"+m.get("1")+" p:"+p.get("1")+ " n:"+n.get("1"));

m.put("1", "mmm");

p.put("1","ppp");

n.put("1", "nnn");

system.out.println("h:"+h.get("1")+" m:"+m.get("1")+" p:"+p.get("1")+ " n:"+n.get("1"));

Java深拷貝與淺拷貝

深拷貝與淺拷貝主要的不同是對於引用變數的拷貝,淺拷貝的引用變數不僅僅是拷貝乙個引用 位址 引用變數的成員也一樣深拷貝。廢話少說下面是兩個拷貝的例子 1.淺拷貝 1 package com.lightcopy 23 public class professor implements cloneable...

「淺拷貝」與「深拷貝」

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...

淺拷貝與深拷貝

淺拷貝 1 2 myclass a,b a b 為了封裝性和解耦,同型別的兩個物件之間進行賦值操作時,所有成員變數被複製,包括私有成員 指標變數。類的成員函式在傳遞或返回物件時都會進行物件複製產生臨時物件,比如函式呼叫時實參變為形參,以及函式返回物件。考慮到效能和使用者要求不同,編譯器不複製物件內部...