繁体   English   中英

如何在Java中克隆通用List?

[英]How do I clone a generic List in Java?

我有一个ArrayList<String> ,我想返回一份副本。 ArrayList有一个克隆方法,它具有以下签名:

public Object clone()

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

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

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

任务完成。

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

这是我用于此的代码:

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

希望对你有用

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

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

...

List<AnObject> clone = myList.stream().collect(toList());

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

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

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

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

我发现使用addAll工作正常。

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

使用括号而不是泛型语法

如果你想要这个以便能够在getter中返回List,那么最好这样做:

ImmutableList.copyOf(list);

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

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

这有点棘手,但如果你只能返回一个List界面,它就可以了,所以你之后的任何人都可以随时实现你的列表。

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

List<String> shallowClonedList = new ArrayList<>(listOfStrings);

请记住,这只是一个浅而非深的副本,即。 你得到一个新的列表,但条目是相同的。 简单的字符串就没问题了。 当列表条目是对象本身时,变得更棘手。

这应该也有效:

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

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

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

我不是一个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);
      }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM