如何制作List类型的ArrayList对象的副本?

时间:2010-08-04 21:36:36

标签: java copy clone

我研究过Java是按值传递对象引用,为了制作对象的本地副本,我可以做clone()或copy-constructor。我还查看了深/浅副本以及stackoverflow上的几个帖子。

现在我看一下例子:

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

我读过的文章很少提到ArrayList实现了cloneable,但是如果type是List not ArrayList并且没有实现cloneable,那么它并没有真正说明如何制作“list”的本地副本。

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

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

但如果type是List,我就不能。

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

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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

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

  

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

     

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

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

答案 2 :(得分:0)

有问题的是,您希望不修改您的收藏,以便使用Collections.unmodifiableList()