如何复制不受原始 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
每个对象。让你的Compartimento
class 实现Cloneable。并克隆List
中的每个对象并添加到另一个List
。
for(Compartimento c : this.listaCompartimentos)
this.listaCompartimentosDEFAULT.add(c.clone());
【讨论】:
这也是我的回答; )。 +1以上是关于如何复制不受原始 ArrayList 更改影响的 ArrayList? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
React(性能):如何防止每次状态更改时出现不必要的渲染? [复制]
Kotlin singleton:如何从singleton复制对象
如何在不指向 Java 源列表中的对象的情况下复制 ArrayList? [复制]