HASHMAP的clone為什麼是淺拷貝

2025-03-26 14:25:10 字數 3806 閱讀 9000

1樓:匿名使用者

hashmap的clone 分淺拷貝和深拷貝;

淺拷螞腔貝就比如像引用型別,而深拷貝就比如值物隱型別。

淺拷貝是指源物件與拷貝物件共用乙份實體,僅僅是引用的變數不同(名稱不同)。對其中任何乙個物件的改動都會影響另外乙個物件。舉個例子,乙個人一開始叫張三,後來改名叫李四了,可是還是同乙個人,不管是張三缺胳膊少腿還是李四缺胳膊少腿,都是這個人倒黴。

深拷貝悶螞衫是指源物件與拷貝物件互相獨立,其中任何乙個物件的改動都不會對另外乙個物件造成影響。舉個例子,乙個人名叫張三,後來用他轉殖(假設法律允許)了另外乙個人,叫李四,不管是張三缺胳膊少腿還是李四缺胳膊少腿都不會影響另外乙個人。比較典型的就是value(值)物件,如預定義型別int32,double,以及結構(struct),列舉(enum)等。

兩者的區別:當有引用型別成員時,淺拷貝複製的是成員的引用,深拷貝複製的是成員物件。

2樓:網友

map泛型集合是放許多物件的乙個容器,你可以這麼理解。打源蠢旦個比方,你有一袋子球(object),你裝乙個檔亂口雹擾袋(map)裡面,現在你換了個一模一樣的袋子裝(clone)。

你只轉殖了袋子,球還是原來的球。

如何完全clone 乙個hashmap

3樓:匿名使用者

如果key和value本身支援deep clone的話。

你就自唯察己唯悄寫乙個指山渣方法實現clonepublic map deepclonemap(map src){map des=new hashmap();

for(iterator it=;;

object key=;

object value=;,

object clone是深複製還是淺複製

4樓:busy氣壯山河

給你下邊的例子,簡單的來說。陣列是沒有被clone,stringbuffer的底層是char 陣列。 所以兩個對是的stringbuffer物件,還是同乙個。

也就是 秒殺腹黑菟 說的深度clone 和淺clone。 被clone的物件,裡面的物件,並沒有一起被clone.

j**a map深度複製問題

5樓:秒殺腹黑菟

這裡的pos是基礎型別,不是引用型別,不需要拿出來單獨複製,淺clone就可以了,但是attr這個map需要進行深度複製,因為這個是引用型別,複製後的物件修改該屬性依然會影響源物件。

clone方法可以簡單寫為。

override

protected object clone() throws clonenotsupportedexception

tempmap;

return elem;}

深拷貝和淺拷貝怎樣理解(通俗具體點兒)

6樓:網友

淺拷貝:也就是在物件複製時,只是對物件中的資料成員進行簡單的賦值,如果物件中存在動態成員,即指標,淺拷貝就會出現問題。

深拷貝:對於深拷貝,針對成員變數存在指標的情況,不僅僅是簡單的指標賦值,而是重新分配記憶體空間。

淺拷貝,即在定義乙個類a,使用類似aobj;aobj1(obj);或者aobj1=obj;時候,由於沒有自定義拷貝建構函式,c++編譯器自動會產生乙個預設的拷貝建構函式。

這個預設的拷貝建構函式採用的是「位拷貝」(淺拷貝),而非「值拷貝」(深拷貝)的方式,如果類中含有指標變數,預設的拷貝建構函式必定出錯。

用一句簡單的話來說就是淺拷貝只是對指標的拷貝,拷貝後兩個指標指向同乙個記憶體空間,深拷貝不但對指標進行拷貝,而且對指標指向的內容進行拷貝,經深拷貝後的指標是指向兩個不同位址的指標。

假如有乙個成員變數的指標,char*m_data;

其一,淺拷貝只是拷貝了指標,使得兩個指標指向同乙個位址,這樣在物件塊結束,呼叫函式析構的時,會造成同乙份資源析構2次,即delete同一塊記憶體2次,造成程式崩潰。

其二,淺拷貝使得和指向同一塊記憶體,任何一方的變動都會影響到另一方。

其三,在釋放記憶體的時候,會造成原有的記憶體沒有被釋放,造成記憶體洩露。

事實是這樣的,當,記憶體被釋放後,由於之前和指向的是同乙個記憶體空間,所指的空間不能在被利用了,也不會成功,一致已經無法操作該空間,所以導致記憶體洩露。

深拷貝採用了在堆記憶體中申請新的空間來儲存資料,這樣每個可以避免指標懸掛。

可以看到在拷貝建構函式中為成員變數申請了新的記憶體空間,這就使得兩個物件的成員變數不指向同乙個記憶體空間,除非你的確需要這樣做,用於實現一些其他的用途。

淺拷貝與深拷貝的區別

7樓:網友

簡單的來說就是,在有指標的情況下,淺拷貝只是增加了乙個指標指向已經存在的記憶體,而深拷貝就是增加乙個指標並且申請乙個新的記憶體,使這個增加的指標指向這個新的記憶體,採用深拷貝的情況下,釋放記憶體的時候就不會出現在淺拷貝時重複釋放同一記憶體的錯誤!

我列舉乙個例子來說吧:

你正在編寫c++程式中有時用到,操作符的過載。最能體現深層拷貝與淺層拷貝的,就是『=』的過載。

看下面乙個簡單的程式:

class string

string()

;string & operator=(const string s)

int main()

上面的 =過載其是就是實現了淺拷貝原因。是由於物件之中含有指標資料型別。s1,s2恰好指向同一各記憶體。所以是淺拷貝。而你如果修改一下原來的程式:

這樣你就實現了深拷貝,原因是你為被賦值物件申請了乙個新的記憶體所以就是深拷貝。

8樓:網友

淺拷貝 只拷貝指標,深拷貝就是拷貝他的值,重新生成的對像。就像是淺拷貝就是你的影子,深拷貝是你的複製人,你沒了影子也就沒了,但是複製人還活著。

9樓:網友

淺拷貝:基本資料型別為值傳遞,物件型別為引用傳遞,深拷貝:對於物件或者數值,所有元素或者屬性均完全複製,與原物件脫離。

10樓:溪貝0號

1、淺拷貝:預設的拷貝就是淺拷貝。僅僅拷貝的是個指標,沒有開闢新的空間回,拷貝出來的新指標指向原答來的空間。

2、深拷貝:自己寫的拷貝,自己申請了動態記憶體空間,用了new 或 malloc 。不但拷貝了指標,而且開闢了新的記憶體空間和原來的空間一樣。

3、用深拷貝的話,最好用自己寫的析構,釋放掉(free或者delete)記憶體空間,也可以用預設析構。

4.用淺拷貝(即預設隱藏的拷貝),最好用預設析構,若用自己寫的析構裡面 ,記得不要釋放記憶體,不然會造成重複釋放記憶體而報錯。

總結:深拷貝: 全拷貝 既拷貝了指標和又拷貝了空間 析構時記得每次要free 和 delete

淺拷貝:指標拷貝 僅僅拷貝了指標指向原來的空間 析構時不要free 和 delete

11樓:彼岸花旁看三生

上面已經有很多大佬說了,我只是覺得這個說法也很有意思,來湊個數。

求hashmap()深複製方法。

12樓:網友

goods goods = ; 應該是這句話有問題吧,goods和都指向同乙個引用。

可以重新定義乙個goods的變數。比如:

goods temp=new goods();

temp.屬性=googs,屬性。

put(key,temp)應該就沒有問題了。

j**a 中的淺拷貝是什麼效果

13樓:網友

只有基礎型別和字串型別的欄位被拷貝。

物件型別的欄位只是做了個引用。

如何執行緒安全的使用HashMap

hashmap,hashset,arraylist都不具備執行緒安全。可以用set s collections.synchronizedset new hashset map m collections.synchronizedmap new hashmap list l collections.s...

併發的hashmap為什麼會引起死迴圈

遞迴死迴圈肯定是中止條件錯了!看了你的 while i len 這個地方造成死迴圈了!因為i的值永遠是0 並且a 0 的值與key不相等 所以死迴圈在這裡!併發的hashmap為什麼會引起死迴圈 遞迴死迴圈肯定是中止條件錯了!看了你的 while i len 這個地方造成死迴圈了!因為i的值永遠是0...

天為什么是藍的 地球為什么是圓的

天空,有的地方是藍色的,有的地方是白色的,有的地方是黑色的,有的地方什麼都看不見空洞洞的,有的地方還會出現海市蜃樓,至於地球為什麼是圓的,物理法則,硬性規律,好像是問蘋果為什麼是圓的一樣,物質最初形態都是圓形 一 表面張力 一滴懸在太空中的液體是圓球形的!這是由於表面張力的作用。地球除薄薄的表面是堅...