我有一个ArrayList,我想准确复制它。我尽可能地使用实用程序类,但前提是有人花了一些时间来使它正确。因此,自然而然地,我得到了Collections一个包含复制方法的类。
ArrayList
Collections
假设我有以下内容:
List<String> a = new ArrayList<String>(); a.add("a"); a.add("b"); a.add("c"); List<String> b = new ArrayList<String>(a.size()); Collections.copy(b,a);
这失败了,因为基本上它认为b不足以容纳a。是的,我知道b大小为0,但现在应该足够大了,不是吗?如果我必须先填补b,那么Collections.copy()脑海中就变成了完全没用的功能。因此,除了编写一个复制函数(我现在要做)之外,还有没有适当的方法来做到这一点?
b
a
Collections.copy()
呼唤
List<String> b = new ArrayList<String>(a);
创建的浅表副本a内b。所有元素将以b与它们完全相同的顺序存在a(假设元素具有顺序)。
同样地,
// note: instantiating with a.size() gives `b` enough capacity to hold everything List<String> b = new ArrayList<String>(a.size()); Collections.copy(b, a);
还创建的浅表副本a内b。如果第一个参数的 容量 (大小)b不足以容纳所有的元素,则它将抛出。期望工作不需要任何分配,如果有分配,那么它将抛出该异常。这是一种优化的方法,要求将复制的集合预先分配(),但由于考虑到基于构造函数的替代方法(如上所示)没有奇怪的副作用,因此需要进行检查,因此我通常认为该功能不值得。 __a``IndexOutOfBoundsExceptionCollections.copyb
a``IndexOutOfBoundsException
Collections.copy
要创建深层副本,必须List通过任一机制对基础类型具有复杂的知识。对于Strings(它在Java中是不变的)(甚至是.NET),您甚至不需要深层副本。对于MySpecialObject,您需要知道如何对其进行深拷贝,而这不是一般操作。
List
String
MySpecialObject
注意:最初接受的答案是Collections.copy在Google中获得最高结果的答案,并且完全没有错,正如评论中指出的那样。