Java 如何复制列表类型的ArrayList对象?

Java 如何复制列表类型的ArrayList对象?,java,copy,clone,Java,Copy,Clone,我研究的Java是按值传递对象引用,为了生成对象的本地副本,我可以执行clone()或copy构造函数。我还查看了深度/浅层副本以及一些关于stackoverflow的帖子 现在我看一个例子: List<String> list = new ArrayList<String>(); String one = "one" list.add(one); List List=new ArrayList(); String one=“一” 列表。添加(一个); 我读过的几篇文

我研究的Java是按值传递对象引用,为了生成对象的本地副本,我可以执行clone()或copy构造函数。我还查看了深度/浅层副本以及一些关于stackoverflow的帖子

现在我看一个例子:

List<String> list = new ArrayList<String>();
String one = "one"
list.add(one);
List List=new ArrayList();
String one=“一”
列表。添加(一个);
我读过的几篇文章都提到ArrayList实现了可克隆性,但并没有真正说明如果类型是list而不是ArrayList,而ArrayList不实现可克隆性,如何制作“list”的本地副本

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

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

ArrayList list=new ArrayList将列表传递给构造函数可能是最好的方法。构造函数调用本身将在幕后使用System.arraycopy。因此,它将有效地从通过构造函数传入的列表中分离本地副本。

尽可能使用副本构造函数
clone()
已过时,不应在新代码中使用(也不应实现)

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

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


从第11项开始。

您似乎想不修改您的收藏,以便可以使用
收藏。不可修改列表()

我不明白。“与可克隆性相关的所有问题”都是什么?为什么它们如此糟糕以至于你永远都不应该调用它?@RussellSilva,
List<String> tmpList = new ArrayList<String>(list);