一尘不染

如何复制Java收藏夹列表

java

我有一个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()脑海中就变成了完全没用的功能。因此,除了编写一个复制函数(我现在要做)之外,还有没有适当的方法来做到这一点?


阅读 219

收藏
2020-09-08

共1个答案

一尘不染

呼唤

List<String> b = new ArrayList<String>(a);

创建的浅表副本ab。所有元素将以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);

还创建的浅表副本ab。如果第一个参数的 容量
(大小)b不足以容纳所有的元素,则它将抛出。期望工作不需要任何分配,如果有分配,那么它将抛出该异常。这是一种优化的方法,要求将复制的集合预先分配(),但由于考虑到基于构造函数的替代方法(如上所示)没有奇怪的副作用,因此需要进行检查,因此我通常认为该功能不值得。
__a``IndexOutOfBoundsExceptionCollections.copyb

要创建深层副本,必须List通过任一机制对基础类型具有复杂的知识。对于Strings(它在Java中是不变的)(甚至是.NET),您甚至不需要深层副本。对于MySpecialObject,您需要知道如何对其进行深拷贝,而这不是一般操作。


注意:最初接受的答案是Collections.copy在Google中获得最高结果的答案,并且完全没有错,正如评论中指出的那样。

2020-09-08