[Java]_如何Deep Copy(深拷貝) ArrayList
前天在寫Android的時候
發現Java居然有這種基本定義與其他程式語言如此相異的問題
就是在陣列拷貝上,並不是採用Deep Copy,也就是將欲複製的陣列Copy一份完全「獨立不相干」到全新的陣列上
用程式碼可能比較好懂
例如
List<String> NEWList = OLDList;
此時這樣Java預設是淺拷貝,也就是僅僅創立一個名為NEWList的Pointer指向OLDList
導致只要OLDList一變動,連帶NEWList的內容也是同步變動的
這問題也沒花我很多時間發現
但要克服這個問題花了一些時間來研究
首先嘗試了以下方法,但結果均為淺拷貝:
第一種:
List<String> NEWList = new ArrayList<String>(OLDList);
第二種:
List<String> NEWList = new ArrayList<String>();
for (Stirng sAP : OLDList) {
NEWList.add(sAP));
}
查了google,但大多數的方式既複雜且沒有用…
所以其實最終解很像是上面第二種,但重新又在記憶體空間建立了一個中繼,轉新增內容進去:
List<String> NEWList = new ArrayList<String>();
for (Stirng sAP : OLDList) {
NEWList.add( new String(sAP)));
}
這樣就能保證兩者內容互不干涉…
至於實際架構運作我也不太了解為何
List<String> NEWList = new ArrayList<String>(OLDList);
不行,而
NEWList.add( new String(sAP)));
卻可以的道理…
最後try出來就是這樣子,我JAVA NOOB,大概只能說到這裡XDD
主要會這樣TRY的靈感來自於
以及
http://stackoverflow.com/questions/6182565/java-deep-copy-shallow-copy-clone
而問題描述可以參考(不過沒說解法XD,而且文末的clone我在Android的JAVA似乎沒看到這個FUNCTION)
http://blog.kenyang.net/2012/01/java.html
另外有些沒啥用的方法(我試過了,但可能對其他情況有用)
http://stackoverflow.com/questions/10457087/how-to-copy-java-util-list-collection
因為NEWList.add(sAP));,sAP是已經產生的物件,因此如果沒有重新分配記憶體,就會直接映射,成為所謂的淺拷貝
而NEWList.add( new String(sAP)));由於每次都是加入新的new String(sAP),記憶體位置與sAP並不一樣,因此可以做到完全拷貝,但相對的也較浪費記憶體空間