[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變細一點,顏色灰色來區別一下3.日誌情況: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);
深拷貝.png
深淺拷貝.png
二、效率問題:以100,000次執行來測試,看平均耗時
1.直接new
pos類,很小:耗時0.006秒new pos(0, 0);
shapeline類,較大:耗時0.491秒2.使用淺拷貝new shapeline().ang(10f).c(200f).parsed().shape(commonshape);
pos類:耗時0.074秒pos.clone(0, 0);
shapeline類:耗時0.351秒3.深拷貝:在淺拷貝中遇到引用資料型別再淺拷貝之sl.clone().ang(10f).c(200f).parsed().shape(commonshape);
shapeline類:耗時:0.427秒4.序列化的深拷貝:將物件序列化後,靠流來重新例項化sl.deepclone().ang(10f).c(200f).parsed().shape(commonshape);
優點是:使用簡單,前者的話要乙個乙個引用來手動轉殖缺點:耗時啊。。。。。。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淺拷貝,沒有...