【问题标题】:Cloning lists in Java [duplicate]Java中的克隆列表[重复]
【发布时间】: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 可以为我完成这项繁重的工作,我也会完全接受,所以请随时提出建议,但是我仍然想知道如何以旧时尚的方式做到这一点,所以我可以学习;-)

【问题讨论】:

  • 发帖前请先搜索

标签: java list generics clone


【解决方案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】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-06
          • 2011-02-12
          • 2014-06-09
          • 2017-04-11
          • 2019-05-09
          • 1970-01-01
          • 2010-09-08
          • 2011-11-14
          相关资源
          最近更新 更多