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

Posted

技术标签:

【中文标题】如何复制不受原始 ArrayList 更改影响的 ArrayList? [复制]【英文标题】:How to copy an ArrayList that cannot be influenced by the original ArrayList changes? [duplicate] 【发布时间】: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 中不起作用。 然后由构造函数赋值。 【参考方案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

以上是关于如何复制不受原始 ArrayList 更改影响的 ArrayList? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

React(性能):如何防止每次状态更改时出现不必要的渲染? [复制]

Kotlin singleton:如何从singleton复制对象

如何在不指向 Java 源列表中的对象的情况下复制 ArrayList? [复制]

如何在不更改原始数组的情况下更改函数中的数组? [复制]

如何在不影响 Flutter 中的原始列表的情况下将列表执行深层复制到另一个列表

如何使图像变暗以保持透明度不受 CSS 或 JS 影响?