【问题标题】:How to make a copy of ArrayList object which is type of List?如何制作 List 类型的 ArrayList 对象的副本?
【发布时间】:2011-03-25 12:19:46
【问题描述】:

我研究了 Java 按值传递对象引用,为了制作对象的本地副本,我可以使用 clone() 或复制构造函数。我还查看了深/浅拷贝以及 Stack Overflow 上的几篇文章。

我在看这个例子:

List<String> list = new ArrayList<String>();
String one = "one"
list.add(one);

我读过的只有几篇文章提到 ArrayList 实现了可克隆,但并没有真正说明如果类型是 List,而不是不实现可克隆的 ArrayList,如何制作“list”的本地副本。

如果“list”是 ArrayList 类型,我可以调用 clone()。

ArrayList<String> list = new ArrayList<String>();
list.clone();

但如果 type 是 List,我不能。

我应该只使用下面的复制构造函数来制作本地副本吗?制作“列表”副本的最佳方法是什么?

List<String> tmpList = new ArrayList<String>(list);

【问题讨论】:

    标签: java copy clone


    【解决方案1】:

    您似乎希望不修改您的收藏,以便可以使用Collections.unmodifiableList()

    【讨论】:

      【解决方案2】:

      尽可能使用复制构造函数。 clone() 已过时,不应在新代码中使用(均未实现)。

      如果你扩展一个类 实现Cloneable,你别无选择,只能实现一个行为良好的clone 方法。否则,您最好提供一种替代方法 对象复制,或者根本不提供该功能。 [...] 一个很好的对象复制方法是提供一个复制构造函数复制工厂. [...]

      考虑到与Cloneable 相关的所有问题,可以肯定地说 其他接口不应该扩展它,并且那些为继承而设计的类 (第 17 项)不应实施。由于它的许多缺点,一些 专家级程序员只需选择从不覆盖 clone 方法并且从不 调用它,也许除了复制数组。

      来自Effective Java 2nd Edition,第 11 项。

      【讨论】:

      • 我不明白。有哪些“与 Cloneable 相关的问题”,为什么它们如此严重以至于您甚至都不应该调用它?
      【解决方案3】:

      将列表传递给构造函数可能是最好的方法。构造函数调用本身将在幕后使用 System.arraycopy。所以它会有效地将本地副本从通过构造函数传入的列表中分离出来。

      【讨论】:

        猜你喜欢
        • 2020-03-01
        • 2017-02-02
        • 2012-10-31
        • 1970-01-01
        • 1970-01-01
        • 2010-11-22
        • 1970-01-01
        • 2015-12-28
        相关资源
        最近更新 更多