2016年9月30日 星期五

Java 關於ArrayList 深度複製

自從學會ArrayList泛型使用,我就開始愛上他來做陣列使用。

簡單的泛型使用類似下面code,第一段是簡單的int泛型,第二段是int[]的陣列。

然後ArrayList也能使用物件來當參數,例如下面:

ArrayList使用容易,也很好分辨

如果你要複製一樣的ArrayList,可以用以下的式子
但是,如果你是使用ArrayList<陣列 or 物件>,你就要特別小心了

例如下面

可以發現到當arrayList改變時,arrayListCopy數值也會跟著改變,是因為ArrayList是淺度複製,當參數是單純變數時(例:int, String, boolean),複製的arrayListCopy不會改變,但當參數是陣列 or 物件,ArrayList<int[]> arrayListCopy=new ArrayList<int[]>(arrayList); arrayListCopy 和 arrayList指向的是同一個記憶體位置,所以會造成某個ArrayList改變時,另一個就會跟著改變。

而如果要簡單解決這問題的話,只要做下面的方法就行了:
ArrayList<int[]> arrayListCopy=new ArrayList<int[]>(arrayList);
改成
 ArrayList<int[]> arrayListCopy=new ArrayList<int[]>();
    
 for(int[] copy:arrayList)
 {
    arrayListCopy.add(copy.clone());
 }

    

一個一個陣列把他複製下來。

也可以使用 BeanUtils.cloneBean來把它複製。

沒有留言:

張貼留言