169

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

public Object clone()

调用此方法后,如何将返回的 Object 转换回ArrayList<String>

4

14 回答 14

339

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

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

任务完成。

于 2008-09-11T12:10:33.567 回答
63
ArrayList newArrayList = (ArrayList) oldArrayList.clone();
于 2008-09-10T18:13:19.663 回答
19

这是我使用的代码:

ArrayList copy = new ArrayList (original.size());
Collections.copy(copy, original);

希望对你有用

于 2012-04-20T18:38:56.303 回答
18

使用 Java 8,它可以用流克隆。

import static java.util.stream.Collectors.toList;

...

List<AnObject> clone = myList.stream().collect(toList());
于 2016-01-26T13:01:38.390 回答
17

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

于 2008-12-08T17:54:29.490 回答
15

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

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

//assume oldList exists and has data in it.
List<String> newList = new ArrayList<String>();
Collections.copy(newList, oldList);
于 2008-09-10T19:48:59.777 回答
10

我发现使用 addAll 效果很好。

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

使用括号而不是泛型语法

于 2008-09-10T18:15:56.800 回答
7

如果您希望这样做以便能够在吸气剂中返回列表,最好这样做:

ImmutableList.copyOf(list);
于 2016-02-16T11:09:42.643 回答
6
List<String> shallowClonedList = new ArrayList<>(listOfStrings);

请记住,这只是浅拷贝而不是深拷贝,即。您会得到一个新列表,但条目是相同的。这对于简单的字符串来说没有问题。当列表条目本身是对象时,变得更加棘手。

于 2019-01-04T14:31:46.590 回答
4

要克隆一个像java.util.List你这样的通用接口,只需要强制转换它。这是一个例子:

List list = new ArrayList();
List list2 = ((List) ( (ArrayList) list).clone());

这有点棘手,但它可以工作,如果你被限制返回一个List接口,那么你之后的任何人都可以随时实现你的列表。

我知道这个答案接近最终答案,但我的答案回答了在您使用List通用父级时如何做所有这些事情,而不是ArrayList

于 2014-09-11T10:39:26.897 回答
2

这也应该有效:

ArrayList<String> orig = new ArrayList<String>();
ArrayList<String> copy = (ArrayList<String>) orig.clone()
于 2008-09-10T18:17:37.967 回答
2

克隆 ArrayList 时要非常小心。java中的克隆很浅。这意味着它只会克隆 Arraylist 本身而不是其成员。因此,如果您有一个 ArrayList X1 并将其克隆到 X2 中,则 X2 中的任何更改也将体现在 X1 中,反之亦然。克隆时,您只会生成一个新的 ArrayList,其中包含指向原始元素中相同元素的指针。

于 2009-03-01T02:52:59.737 回答
1
ArrayList first = new ArrayList ();
ArrayList copy = (ArrayList) first.clone ();
于 2008-09-10T18:13:17.183 回答
1

我不是java专业人士,但我有同样的问题,我试图通过这种方法解决。(假设 T 有一个复制构造函数)。

 public static <T extends Object> List<T> clone(List<T> list) {
      try {
           List<T> c = list.getClass().newInstance();
           for(T t: list) {
             T copy = (T) t.getClass().getDeclaredConstructor(t.getclass()).newInstance(t);
             c.add(copy);
           }
           return c;
      } catch(Exception e) {
           throw new RuntimeException("List cloning unsupported",e);
      }
}
于 2012-01-23T12:19:06.727 回答