Java中的克隆列表[重复]

Posted

技术标签:

【中文标题】Java中的克隆列表[重复]【英文标题】:Cloning lists in Java [duplicate] 【发布时间】:2012-02-13 11:24:14 【问题描述】:

可能重复:How to clone ArrayList and also clone its contents?

我有一个ArrayList<Widget>,我想“深入”克隆,以便对原始列表中的任何项目进行修改不会对克隆列表中的项目产生任何影响:

ArrayList<Widget> origList = getMyList();
ArrayList<Widget> cloneList = origList.clone();

// Remove the 5th Widget from the origina list
origList.remove(4);

// However, the cloneList still has the 5th Widget and is unchanged

// Change the id of the first widget
origList.get(0).setId(20);

// However in cloneList, the 1st Widget's ID is not 20

实现此目的最好/最安全的方法是什么?我想它并不像这样简单:

ArrayList<Widget> cloneList = origList.clone();

我想这是一个内置的ArrayList 类型,再加上它的泛型这一事实会使事情复杂化。我还想我需要为我的Widget 类编写一个特殊的clone() 覆盖?

提前致谢!

编辑: 如果有一个公共 JAR 可以为我完成这项繁重的工作,我也会完全接受,所以请随时提出建议,但是我仍然想知道如何以旧时尚的方式做到这一点,所以我可以学习;-)

【问题讨论】:

发帖前请先搜索 【参考方案1】:

这是一项不平凡的任务,我建议您使用其中一个可用的库,例如http://code.google.com/p/cloning/

另见:Java: recommended solution for deep cloning/copying an instance

如果您想了解它是如何完成的,请获取一个开源库并查看源代码 :)

【讨论】:

【参考方案2】:

您需要遍历原始列表中的每个项目并单独克隆每个项目,然后将它们添加到“克隆”项目的新列表中。

类似:

List<Widget> origList = getMyList();
List<Widget> clonedList = clone(origList);

private List<Widget> clone(List<Widget> listToClone) 
  List<Widget> clonedList = new LinkedList<Widget>();

  for (Widget widget : listToClone) 
    clonedList.add(widget.clone());
  

  return clonedList;

为此,您必须让您的Widget 对象实现Cloneable 接口和clone() 方法。不需要其他任何东西。

但是,正如其他发帖人所说,许多人会争辩说,Java 中的 clone 实现并不好依赖,最好避免使用。

【讨论】:

【参考方案3】:

一些权威机构不鼓励使用clone。 Here is one link off google。这并不是说不要这样做,而是要意识到自己陷入了什么困境,并确保进行测试(嗯,总是这样做)。

我可能会在根类上放置一个deepCopy 方法,然后使用复制构造函数以蛮力方式进行复制。复制构造函数是一个构造函数,它接受相关类的实例,并创建一个新实例,将参数的内部状态复制到新实例中。

【讨论】:

【参考方案4】:

你可能想看看这个:http://code.google.com/p/cloning/

【讨论】:

以上是关于Java中的克隆列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript中的克隆对象[重复]

避免在 Java 中的列表中插入重复值

java 检查列表中的重复项

在 Java 中的对象列表中搜索字段 [重复]

如何在java中的对象列表中查找重复项

Java:有效地将列表中的项目放入 HashMap [重复]