2013-05-15 260 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 –

相关问题