2010-08-04 38 views
7

我研究过的Java是通过值传递对象引用,并且为了创建对象的本地副本,我可以执行clone()或copy-constructor。我也看过深/浅拷贝以及在stackoverflow上的几个帖子。如何制作List类型的ArrayList对象的副本?

现在我在看例子:

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

几篇文章我只读提到的ArrayList实现可复制的,但并没有真正说如何让“名单”的本地副本,如果类型列表ArrayList不是哪不实现可复制。

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

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

但是,如果类型是列表,我不能。

我应该使用像下面这样的拷贝构造函数来进行本地拷贝吗?制作“列表”副本的最佳方法是什么?

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

回答

5

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

0

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

如果要扩展一个类, 实现Cloneable,你别无选择,只能实现一个乖巧clone方法。否则,您最好提供替代方法 对象复制,或者根本不提供该功能。 [...] 甲精细的方法来复制对象是提供一种拷贝构造拷贝工厂 [...]

鉴于所有与Cloneable相关的问题,这是肯定地说, 其他接口不应该扩展它,并专为继承 (第17项)类不应该实现它。因为它的许多不足之处,一些 专业程序员只需选择从来没有覆盖clone方法,从不 调用它,也许除了复制阵列。

Effective Java 2nd Edition,项目11

+0

我不明白。与Cloneable相关的所有“问题”是什么,以及它们为什么如此糟糕,以至于您甚至不应该去调用它? – 2013-07-17 23:40:03

+1

@RussellSilva,http://jtechies.blogspot.hu/2012/07/item-11-override-clone-judiciously.html – 2013-07-20 21:12:12

0

似乎由您想让您的收藏未修改所以你可以使用Collections.unmodifiableList()问题。

相关问题