如何将一个java.util.List复制到另一个java.util.List中

180

我有一个从Web服务中填充的 List<SomeBean>,我想将该列表的内容复制/克隆到同类型的空列表中。在谷歌搜索复制列表时,建议我使用 Collections.copy() 方法。在我看过的所有示例中,目标列表都应包含要进行复制的确切数量的项目。

由于我使用的列表是通过 Web 服务填充的,并且它包含数百个对象,因此我无法使用上述技术。或者我使用的方法不正确??!!无论如何,为了使它工作,我尝试做这样的事情,但我仍然得到了 IndexOutOfBoundsException

List<SomeBean> wsList = app.allInOne(template);

List<SomeBean> wsListCopy=new ArrayList<SomeBean>(wsList.size());   
Collections.copy(wsListCopy,wsList);
System.out.println(wsListCopy.size());

我试图使用wsListCopy = wsList.subList(0, wsList.size()),但稍后在代码中我遇到了ConcurrentAccessException。尝试和错误 :)

无论如何,我的问题很简单,如何将列表的所有内容复制到另一个列表中? 当然不能通过迭代。


12
任何副本都会使用迭代,这是必然的。你可以隐藏它,但它仍将存在。 - Peter Lawrey
2
首先:你确定需要复制那个列表吗?你这么做的动机是什么? - ppeterka
2
是的,迭代只是隐藏在那些层下面。但是添加了注释以防止任何迭代答案。 :) - Mono Jamoon
@ppeterka 我正在对列表执行操作,例如removeAll()。这会导致列表丢失其原始数据。而且,“那些数据”之后也是需要的。 - Mono Jamoon
app.allInOne(template) 返回的列表的实际类型是什么?ArrayList吗? - Andremoniy
你想要一个浅拷贝还是深拷贝 - cellepo
14个回答

0
关于 IndexOutOfBoundsException 的问题,你的子列表参数有问题;你需要将子列表结束位置设置为 size-1。因为基于零索引,列表的最后一个元素总是 size-1,size 位置不存在元素,所以会出现错误。

0

我没有看到任何正确的答案。如果你想深度复制,你必须手动迭代和复制对象(你可以使用拷贝构造函数)。


这是这里少数几个真正的答案之一。更多细节请参见:https://dev59.com/kXRB5IYBdhLWcg3wHkPi - cellepo

0
你应该使用 addAll 方法。它将指定集合中的所有元素追加到副本列表的末尾。这将是您列表的一个副本。
List<String> myList = new ArrayList<>();
myList.add("a");
myList.add("b");
List<String> copyList = new ArrayList<>();
copyList.addAll(myList);

-3

subList函数是一个技巧,返回的对象仍然在原始列表中。 因此,如果您在subList中执行任何操作,无论是单线程还是多线程,都会导致代码中的并发异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接