我有一个 ArrayList<String>
,希望返回它的一个副本。 ArrayList
有一个克隆方法,其签名如下:
public Object clone()
调用这个方法之后,我该如何将返回的对象转换回
ArrayList<String>
?我有一个 ArrayList<String>
,希望返回它的一个副本。 ArrayList
有一个克隆方法,其签名如下:
public Object clone()
ArrayList<String>
?为什么要克隆?一般来说,创建一个新列表更有意义。
List<String> strs;
...
List<String> newStrs = new ArrayList<>(strs);
完成工作。
ArrayList(Collection<? extends E> c)
,意味着你可以使用任何类型的列表作为参数,这并不重要。 - cdmckayArrayList newArrayList = (ArrayList) oldArrayList.clone();
ArrayList<String> newArrayList = (ArrayList<String>) oldArrayList.clone();
。 - cdmckayList<String>
而不是ArrayList<String>
。这是大多数情况下应该使用集合的方式。 - Christophe Roussy使用Java 8,可以使用流进行克隆。
import static java.util.stream.Collectors.toList;
...
List<AnObject> clone = myList.stream().collect(toList());
toCollection
可能是更好的选择。 - Tom Hawtin - tackline这是我用来做那件事的代码:
ArrayList copy = new ArrayList (original.size());
Collections.copy(copy, original);
希望这对你有用
ArrayList<YourObject>
代替ArrayList
。 - milosmnsArrayList
构造函数的复制重载呢? - Tom Hawtin - tackline请注意,Object.clone()存在一些重大问题,在大多数情况下不建议使用。请查看Effective Java中的第11项建议,获得完整答案。我认为您可以安全地在原始类型数组上使用Object.clone(),但除此之外,您需要审慎地正确使用和覆盖clone方法。您最好定义一个复制构造函数或静态工厂方法,根据您的语义明确克隆对象。
我认为使用集合API可以解决问题:
注意:复制方法的运行时间为线性时间。
//assume oldList exists and has data in it.
List<String> newList = new ArrayList<String>();
Collections.copy(newList, oldList);
copyList.addAll(original);
是一个很好的替代方案。 - Gene BoaddAll
。 - Tom Hawtin - tackline我发现使用addAll很好用。
ArrayList<String> copy = new ArrayList<String>();
copy.addAll(original);
在这里,括号被用来代替泛型语法。
new ArrayList<String>(original)
呢? - user102008List<String> copy = new ArrayList<>(original);
具有减少开销的额外好处,与 List<String> list = new ArrayList<>(original); list.addAll(orig);
相比可能稍微快一点(尚未测试),尽管为了性能而仅使用构造函数参数而不是 addAll(Collection)
进入了过早优化的领域,但我只是使用它因为它更短而已。 - Jonathan PreciseList<String> shallowClonedList = new ArrayList<>(listOfStrings);
请记住,这只是浅拷贝而不是深拷贝,即您获得了一个新列表,但条目相同。对于简单的字符串来说,这没有问题。当列表条目本身是对象时,情况会变得更加棘手。
如果您希望为了能够在getter中返回列表,最好这样做:
ImmutableList.copyOf(list);
java.util.List
,只需要进行强制类型转换。以下是一个例子:List list = new ArrayList();
List list2 = ((List) ( (ArrayList) list).clone());
虽然有些棘手,但如果你只能返回一个List
接口,那么它是可行的,这样任何人在你之后都可以随时实现你的列表。
我知道这个答案已经接近最终答案了,但我的答案解释了如何在使用泛型父类List
而不是ArrayList
的情况下完成所有操作。