來談談Java的深淺拷貝吧

2021-08-29 00:23:53 字數 2925 閱讀 4792

[1].本文是我開發logiccanvas庫的記錄日誌之一,基本使用見:
一、深拷貝與淺拷貝

1.用淺拷貝的話:

shapeline a = (shapeline) sl.ang(10f).c(200f).parsed().shape(commonshape);

shapeline b = (shapeline) a.clone().coo(coo).ss(color.red).p(100, 100).b(3);

painter.draw(b);

a.mv.resize(500);

painter.draw(b);

使用淺拷貝拷貝a形狀的屬性得到b形狀,a.mv.resize(100);是改變屬性中的尺寸

在這前後兩次繪製b,可以看出a的改變會到至b的改變

淺拷貝乙個,他倆的引用資料型別還藕斷絲連,一變皆變,當然這並不是我想要的。

淺拷貝

2.再來看看深拷貝拷貝的話:

將第二個b變細一點,顏色灰色來區別一下

shapeline a = (shapeline) sl.ang(40f).c(200f).parsed().shape(commonshape);

shapeline b = (shapeline) a.deepclone().coo(coo).ss(color.red).p(100, 100).b(3);

painter.draw(b.ss(color.gray).b(5));

a.mv.resize(500);

painter.draw(b.ss(color.blue).b(1)).cap(b);

3.日誌情況:

深拷貝.png

深淺拷貝.png

二、效率問題:以100,000次執行來測試,看平均耗時

1.直接new

pos類,很小:耗時0.006秒

new pos(0, 0);
shapeline類,較大:耗時0.491秒

new shapeline().ang(10f).c(200f).parsed().shape(commonshape);
2.使用淺拷貝
pos類:耗時0.074秒

pos.clone(0, 0);
shapeline類:耗時0.351秒

sl.clone().ang(10f).c(200f).parsed().shape(commonshape);
3.深拷貝:在淺拷貝中遇到引用資料型別再淺拷貝之
shapeline類:耗時:0.427秒

sl.deepclone().ang(10f).c(200f).parsed().shape(commonshape);
4.序列化的深拷貝:將物件序列化後,靠流來重新例項化
優點是:使用簡單,前者的話要乙個乙個引用來手動轉殖

缺點:耗時啊。。。。。。15.888秒

sl.formall().ang(10f).c(200f).parsed().shape(commonshape);
總結:就100,000次來看,比較小的類new 不怎麼耗時,但是一直開闢記憶體空間,淺拷貝雖然慢些,但0.07+/10w次還是很快的

大的類有很多的話就不建議序列化的深拷貝,太耗時了。除此之後深淺new都差不了多少,當然深拷貝比較好啦。

如果有什麼錯誤之處歡迎批評指正。最後,還希望大家關注一下我的開源專案:logiccanvas

三、**
/**

* 序列化深拷貝:慎用

** @return

*/public shapeline formall() catch (exception e)

return null;

}/**

* 淺轉殖

** @return 淺轉殖物件

*/public shapeline clone() catch (clonenotsupportedexception e)

return clone;

}/**

* 深轉殖物件

** @return 深轉殖物件

*/public shapeline deepclone()

clone.mp = mp.clone();

clone.ma = ma.clone();

clone.mcoo = mcoo.clone();

} catch (clonenotsupportedexception e)

return clone;

}

後記、

1.宣告:

2.連線傳送門:

3.聯絡我

深淺拷貝以及深淺拷貝的方法

先考慮一種情況,對乙個已知物件進行拷貝,編譯系統會自動呼叫一種建構函式 拷貝建構函式,如果使用者未定義拷貝建構函式,則會呼叫預設拷貝建構函式。執行結果 呼叫一次建構函式,呼叫兩次析構函式,兩個物件的指標成員所指記憶體相同,name指標被分配一次記憶體,但是程式結束時該記憶體卻被釋放了兩次,會造成記憶...

C 什麼是深淺拷貝,深淺拷貝的區別?

淺拷貝 class string string const string s str s.str string operator const string s 返回引用是為了連續的賦值 return this string 防止野指標的出現 str null char str get void st...

python 的深淺拷貝

在python中,物件賦值實際上是物件的引用。當建立乙個物件,然後把它賦給另乙個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用 一般有三種方法,alist 1,2,3,a b 1 直接賦值,傳遞物件的引用而已,原始列表改變,被賦值的b也會做相同的改變 2 copy淺拷貝,沒有...