Bil*_*ard 149 java generics clone arraylist
我有一个ArrayList<String>我想要寄回的副本. ArrayList有一个克隆方法,具有以下签名:
public Object clone()
Run Code Online (Sandbox Code Playgroud)
调用此方法后,如何将返回的Object转换回ArrayList<String>?
Tom*_*ine 311
你为什么要克隆?创建新列表通常更有意义.
List<String> strs;
...
List<String> newStrs = new ArrayList<>(strs);
Run Code Online (Sandbox Code Playgroud)
任务完成.
Vin*_*vic 58
ArrayList newArrayList = (ArrayList) oldArrayList.clone();
Run Code Online (Sandbox Code Playgroud)
小智 20
这是我用于此的代码:
ArrayList copy = new ArrayList (original.size());
Collections.copy(copy, original);
Run Code Online (Sandbox Code Playgroud)
希望对你有用
Sim*_*ins 19
使用Java 8,可以使用流克隆它.
import static java.util.stream.Collectors.toList;
Run Code Online (Sandbox Code Playgroud)
...
List<AnObject> clone = myList.stream().collect(toList());
Run Code Online (Sandbox Code Playgroud)
Jul*_*ang 16
请注意,Object.clone()存在一些主要问题,在大多数情况下不鼓励使用它.请参阅Joshua Bloch的" Effective Java "中的第11项,以获得完整的答案.我相信你可以安全地在原始类型数组上使用Object.clone(),但除此之外,你需要明智地正确使用和重写克隆.您可能最好定义一个复制构造函数或静态工厂方法,根据您的语义显式克隆对象.
Aar*_*ron 14
我认为这应该使用Collections API来解决问题:
注意:复制方法以线性时间运行.
//assume oldList exists and has data in it.
List<String> newList = new ArrayList<String>();
Collections.copy(newList, oldList);
Run Code Online (Sandbox Code Playgroud)
我发现使用addAll工作正常.
ArrayList<String> copy = new ArrayList<String>();
copy.addAll(original);
Run Code Online (Sandbox Code Playgroud)
使用括号而不是泛型语法
如果你想要这个以便能够在getter中返回List,那么最好这样做:
ImmutableList.copyOf(list);
Run Code Online (Sandbox Code Playgroud)
List<String> shallowClonedList = new ArrayList<>(listOfStrings);
Run Code Online (Sandbox Code Playgroud)
请记住,这只是一个浅拷贝而不是深拷贝,即。您会得到一个新列表,但条目是相同的。这对于简单的字符串没有问题。当列表条目本身是对象时,Get 会更加棘手。