我有一个ArrayList<String>
我想退还的副本。 ArrayList
有一个具有以下签名的克隆方法:
public Object clone()
调用此方法后,如何将返回的对象强制转换回ArrayList<String>
?
我有一个ArrayList<String>
我想退还的副本。 ArrayList
有一个具有以下签名的克隆方法:
public Object clone()
调用此方法后,如何将返回的对象强制转换回ArrayList<String>
?
Answers:
ArrayList newArrayList = (ArrayList) oldArrayList.clone();
ArrayList<String> newArrayList = (ArrayList<String>) oldArrayList.clone();
。
List<String>
而不是ArrayList<String>
在左侧。这就是大多数情况下应该使用集合的方式。
为什么要克隆?创建新列表通常更有意义。
List<String> strs;
...
List<String> newStrs = new ArrayList<>(strs);
任务完成。
ArrayList(Collection<? extends E> c)
意味着您使用哪种列表作为参数都无关紧要。
这是我使用的代码:
ArrayList copy = new ArrayList (original.size());
Collections.copy(copy, original);
希望对您有用
ArrayList
使用ArrayList<YourObject>
ArrayList
构造函数的复制重载?
使用Java 8可以将其克隆为流。
import static java.util.stream.Collectors.toList;
...
List<AnObject> clone = myList.stream().collect(toList());
toCollection
可能是一个更好的选择。
请注意,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);
List<MySerializableObject> copyList = new ArrayList<>(mMySerializableObjects.size());
似乎使用copyList.addAll(original);
是一个很好的选择
int
争论的乐趣。我不知道为什么你要使用这种晦涩的静态方法代替好旧的方法addAll
。
我发现使用addAll可以正常工作。
ArrayList<String> copy = new ArrayList<String>();
copy.addAll(original);
使用括号而不是泛型语法
new ArrayList<String>(original)
?
如果您希望这样做,以便能够在getter中返回List,则最好这样做:
ImmutableList.copyOf(list);
要克隆一个通用接口,java.util.List
只需要强制转换即可。这是一个例子:
List list = new ArrayList();
List list2 = ((List) ( (ArrayList) list).clone());
这有点棘手,但是如果您只能返回一个List
接口,那么它就可以工作,因此任何人都可以在需要时实现列表。
我知道这个答案很接近最终答案,但是我的答案却回答了在与List
-generic parent- 一起工作时如何做所有这些事情。ArrayList
克隆ArrayList时要非常小心。用Java克隆很浅。这意味着它将仅克隆Arraylist本身,而不克隆其成员。因此,如果您有一个ArrayList X1并将其克隆到X2中,则X2中的任何更改也将在X1中显示,反之亦然。克隆时,您将只生成一个新的ArrayList,该ArrayList带有指向原始元素中相同元素的指针。
我不是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);
}
}
List
实现类具有公共的无参数构造函数。例如,List
s返回Array.asList
,List.of
或者List.subList
可能不是。