如何复制不受原始ArrayList影响的ArrayList更改?

时间:2013-05-15 10:40:16

标签: java arraylist cloning

我一直在我的项目中使用ArrayLists,我需要创建一个默认的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”。

3 个答案:

答案 0 :(得分:5)

克隆意味着您有2个不同的列表,但它们的内容是相同的。如果更改第一个列表中对象的状态,它将在第二个列表中更改。

使用copy-constructors并避免使用clone()

new ArrayList(originalList)

应该避免使用arraylists的克隆(),因为即使它创建新实例,它也会保留相同的元素。因此,在列表上更改的元素将在第二个上更改。

下面的代码将创建一个包含新元素的新实例。

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

我建议clone每个对象。让您的Compartimento类实现Cloneable。并克隆List中的每个对象,然后添加到另一个List

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