我有ArrayList<String>
我想要寄回一份副本。 ArrayList
有一个克隆方法,它具有以下签名:
public Object clone()
调用此方法后,如何将返回的对象强制转换回ArrayList<String>
?
答案 0 :(得分:306)
你为什么要克隆?创建新列表通常更有意义。
List<String> strs;
...
List<String> newStrs = new ArrayList<>(strs);
完成工作。
答案 1 :(得分:55)
ArrayList newArrayList = (ArrayList) oldArrayList.clone();
答案 2 :(得分:20)
这是我用于此的代码:
ArrayList copy = new ArrayList (original.size());
Collections.copy(copy, original);
希望对你有用
答案 3 :(得分:19)
使用Java 8,可以使用流克隆它。
import static java.util.stream.Collectors.toList;
...
List<AnObject> clone = myList.stream().collect(toList());
答案 4 :(得分:16)
请注意,Object.clone()存在一些主要问题,在大多数情况下不鼓励使用它。请参阅Joshua Bloch的“Effective Java”中的第11项,以获得完整的答案。我相信你可以安全地在原始类型数组上使用Object.clone(),但除此之外,你需要明智地正确使用和重写克隆。您最好定义一个复制构造函数或静态工厂方法,根据您的语义显式克隆该对象。
答案 5 :(得分:14)
我认为这应该可以使用Collections API来实现:
注意:复制方法以线性时间运行。
//assume oldList exists and has data in it.
List<String> newList = new ArrayList<String>();
Collections.copy(newList, oldList);
答案 6 :(得分:8)
我发现使用addAll工作正常。
ArrayList<String> copy = new ArrayList<String>();
copy.addAll(original);
使用括号而不是泛型语法
答案 7 :(得分:6)
如果你想要这个以便能够在getter中返回List,那么最好这样做:
ImmutableList.copyOf(list);
答案 8 :(得分:3)
要克隆像java.util.List
这样的通用界面,您只需要投射它。在这里你是一个例子:
List list = new ArrayList();
List list2 = ((List) ( (ArrayList) list).clone());
这有点棘手,但如果你只能返回一个List
界面,它就可以了,所以你身后的任何人都可以随时实现你的列表。
我知道这个答案接近最终答案,但我的答案是在你使用List
- 通用父母而不是ArrayList
答案 9 :(得分:2)
这也应该有效:
ArrayList<String> orig = new ArrayList<String>();
ArrayList<String> copy = (ArrayList<String>) orig.clone()
答案 10 :(得分:2)
克隆ArrayLists时要非常小心。在Java中克隆很浅。这意味着它只会克隆Arraylist本身而不是其成员。因此,如果您有一个ArrayList X1并将其克隆到X2中,X2中的任何更改也将在X1中显示,反之亦然。克隆时,您将只生成一个新的ArrayList,其中包含指向原始元素中相同元素的指针。
答案 11 :(得分:1)
ArrayList first = new ArrayList ();
ArrayList copy = (ArrayList) first.clone ();
答案 12 :(得分: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);
}
}
答案 13 :(得分:1)
List<String> shallowClonedList = new ArrayList<>(listOfStrings);
请记住,这只是浅表而不是深表,即。您将获得一个新列表,但条目相同。对于简单的字符串,这没有问题。当列表条目本身就是对象时,变得更加棘手。