[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://kc1551.wordpress.com/2012/02/06/%E5%85%B3%E4%BA%8Ejava-arraylist%E6%B7%B1%E6%8B%B7%E8%B4%9D%E5%92%8C%E6%B5%85%E6%8B%B7%E8%B4%9D%E7%9A%84%E4%B8%80%E4%BA%9B%E6%B3%A8%E6%84%8F%E7%82%B9/

以及

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

 

1 Comment

  1. 因為NEWList.add(sAP));,sAP是已經產生的物件,因此如果沒有重新分配記憶體,就會直接映射,成為所謂的淺拷貝
    而NEWList.add( new String(sAP)));由於每次都是加入新的new String(sAP),記憶體位置與sAP並不一樣,因此可以做到完全拷貝,但相對的也較浪費記憶體空間

Leave a comment

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料