如何在Java中克隆通用列表?

时间:2020-03-05 18:50:57  来源:igfitidea点击:

我有一个要返回其副本的ArrayList <String>。 ArrayList具有一个具有以下签名的克隆方法:

public Object clone()

调用此方法后,如何将返回的对象强制转换回ArrayList &lt;String>

解决方案

回答

ArrayList first = new ArrayList ();
ArrayList copy = (ArrayList) first.clone ();

回答

ArrayList newArrayList = (ArrayList) oldArrayList.clone();

回答

我发现使用addAll可以正常工作。

ArrayList<String> copy = new ArrayList<String>();
copy.addAll(original);

使用括号而不是泛型语法

回答

这也应该起作用:

ArrayList<String> orig = new ArrayList<String>();
ArrayList<String> copy = (ArrayList<String>) orig.clone()

回答

我认为这应该使用Collections API来解决问题:

注意:复制方法以线性时间运行。

//assume oldList exists and has data in it.
List<String> newList = new ArrayList<String>();
Collections.copy(newList, oldList);

回答

为什么要克隆?创建一个新列表通常更有意义。

List<String> strs;
...
List<String> newStrs = new ArrayList<>(strs);

任务完成。

回答

请注意,Object.clone()存在一些主要问题,在大多数情况下,建议不要使用它。请参阅Joshua Bloch撰写的" Effective Java"中的第11项,以获取完整的答案。我相信我们可以在原始类型数组上安全地使用Object.clone(),但除此之外,我们还需要谨慎地正确使用和覆盖克隆。最好定义一个复制构造函数或者一个静态工厂方法来根据语义显式克隆对象。

回答

克隆ArrayList时要非常小心。用Java克隆很浅。这意味着它将仅克隆Arraylist本身,而不克隆其成员。因此,如果我们有一个ArrayList X1并将其克隆到X2中,则X2中的任何更改也将在X1中显示,反之亦然。克隆时,我们将只生成一个新的ArrayList,该ArrayList带有指向原始元素中相同元素的指针。