2013-05-15 307 views
0

我一直在使用我的項目上的ArrayLists,我需要創建一個默認的ArrayList,所以我可以重置原來的一個我想要的。所以,我複製原始的ArrayList來創建默認的ArrayList。但是,每當我修改原始內容時,它也會更改默認的內容。我怎樣才能使複製「靜態」和不變?如何複製不受原始ArrayList影響的ArrayList更改?

這裏是我的代碼(這是葡萄牙語)

private ArrayList<Compartimento> listaCompartimentos; 
private ArrayList<Compartimento> listaCompartimentosDEFAULT; 

public Simulador() { 
     this.listaCompartimentos = new ArrayList<>(); 
     this.listaCompartimentosDEFAULT=new ArrayList<>(); 
    } 

//Copy of the array 
public void gravarListaDefault(){ 
     this.listaCompartimentosDEFAULT=(ArrayList<Compartimento>)listaCompartimentos.clone(); 
    } 

注:我不知道,如果它可以是它背後的原因,但該ArrayList listaCompartimentos有listaEquipamentos。對於每個「Compartimento」,都有一個ArrayList「listaEquipamentos」。

+1

我不認爲你應該在那裏使用克隆。不是Java專家,但我認爲一個簡單的任務是可行的。 – Gjordis

+0

@Gjordis你是對的; )(關於克隆) –

+0

@Gjordis簡單分配在Java中不起作用。 – johnchen902

回答

5

克隆意味着你有2個不同的列表,但它們的內容是相同的。如果更改第一個列表中的對象的狀態,它將在第二個列表中更改。

使用拷貝構造函數和避免clone()

new ArrayList(originalList)

的clone()爲的ArrayList應該避免,因爲即使它會創建一個新的例如,它擁有相同的元素。因此,在列表中更改的元素將在第二個元素上更改。

下面的代碼將創建一個帶有新元素的新實例。

ArrayList<Object> clone = new ArrayList<Object>(); 
for(Object o : originalList) 
clone.add(o.clone()); 
+2

@AsierAranbarri克隆確實創建了一個淺拷貝。它在[docs]中說(http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html#clone%28%29) – NilsH

+0

@NilsH oops,想說克隆不會使新列表指向克隆對象的內存位置。我的錯誤,需要更多的咖啡 –

+0

問題是:在我的主類中,使用包含這兩個ArrayLists的相應對象,我填充原始的一個,然後才克隆它。這兩個ArrayList都屬於類「Simulador」,所以,如果我必須使用複製構造函數,你告訴我要創建兩個「Simulador」? – Carlito

2
this.listaCompartimentosDEFAULT = new ArrayList<Compartimento>(
      listaCompartimentos); 
1

我會建議clone每個對象。讓你的Compartimento類實現Cloneable。並克隆List中的每個對象,並將其添加到其他List

for(Compartimento c : this.listaCompartimentos) { 
    this.listaCompartimentosDEFAULT.add(c.clone()); 
} 
+0

這也是我的答案; )。 +1 –

相關問題