【问题标题】:How to copy an ArrayList that cannot be influenced by the original ArrayList changes? [duplicate]如何复制不受原始 ArrayList 更改影响的 ArrayList? [复制]
【发布时间】:2013-05-09 21:31:41
【问题描述】:

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

【问题讨论】:

  • 我认为你不应该在那里使用克隆。不是 Java 专家,但我认为一个简单的任务就可以了。
  • @Gjordis 你是对的; )(关于克隆)
  • @Gjordis 简单赋值在 Java 中不起作用。
  • 然后由构造函数赋值。

标签: java arraylist cloning


【解决方案1】:

clone() for ArrayLists 应该避免,因为即使它创建了一个新的List 实例,它也包含相同的元素。因此,在第一个 List 上更改的元素也将在第二个上更改。 两个不同的对象持有相同的引用。

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

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

【讨论】:

  • @AsierAranbarri 克隆确实创建了一个浅拷贝。它在docs 中说
  • 问题是:在我的主类中,使用包含这两个 ArrayLists 的相应对象,我填充了原始的,然后我克隆了它。这两个 ArrayList 都属于“Simulador”类,所以如果我必须使用复制构造函数,你是在告诉我创建两个“Simulador”吗?
  • 你必须这样做。克隆列表时,您创建的是一个新列表,而不是新元素。
  • 好像new ArrayList(originalList) 也创建了一个浅拷贝,引用与originalList 相同。
  • 好的,知道了...再次感谢您
【解决方案2】:
this.listaCompartimentosDEFAULT = new ArrayList<Compartimento>(
            listaCompartimentos);

【讨论】:

    【解决方案3】:

    我建议clone 每个对象。让你的Compartimentoclass 实现Cloneable。并克隆List 中的每个对象并添加到另一个List

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

    【讨论】:

    • 这也是我的回答; )。 +1
    猜你喜欢
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 2013-11-25
    • 2019-02-28
    相关资源
    最近更新 更多