tangguo

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

java

我研究过Java是按值传递对象引用,并且为了创建对象的本地副本,我可以执行clone()或copy-constructor。我还查看了深/浅副本以及关于stackoverflow的几篇文章。

现在我看一个例子:

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

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

如果“列表”是ArrayList的类型,则可以调用clone()。

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

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

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

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

阅读 521

收藏
2020-10-16

共2个答案

小编典典

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

2020-10-16
小编典典

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

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

考虑到与关联的所有问题Cloneable,可以肯定地说其他接口不应扩展它,而为继承而设计的类(第17项)也不应实现它。由于它的许多缺点,一些专业的程序员只是选择永不重写该clone方法,也不要调用它,除非复制数组。

2020-10-16