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

我有一个从Web服务填充的List<SomeBean> 。 我想将该列表的内容复制/克隆到相同types的空列表中。 谷歌search复制列表build议我使用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 wsListCopy=wsList.subList(0, wsList.size()) 。 打和审判。 🙂

无论如何,我的问题很简单, 我怎样才能将我的列表的全部内容复制到另一个列表? 当然不是通过迭代。

只需使用这个:

 List<SomeBean> newList = new ArrayList<SomeBean>(otherList); 

注意:仍然不是线程安全的,如果你从另外一个线程修改otherList ,那么你可能想让这个otherList (甚至newList )成为一个CopyOnWriteArrayList ,或者使用一个locking原语,比如ReentrantReadWriteLock来串行化读/写访问到任何列表同时访问。

这是一个非常好的Java 8方法:

 List<String> list2 = list1.stream().collect(Collectors.toList()); 

当然,这里的好处是你可以过滤和跳过列表的一部分的副本。

例如

 //don't copy the first element List<String> list2 = list1.stream().skip(1).collect(Collectors.toList()); 

我试图做这样的事情,但我仍然有IndexOutOfBoundsException。

我有一个ConcurrentAccessException

这意味着您在尝试复制列表时正在修改列表,很可能是在另一个线程中进行的。 要解决这个问题,你必须要么

  • 使用专为并发访问而devise的集合。

  • locking收集适当,所以你可以迭代它(或允许你调用一个方法,为你做这个)

  • 避免需要复制原始列表。

 originalArrayList.addAll(copyArrayofList); 

请记住,每当使用addAll()方法进行复制时,对同一对象的数组列表(originalArrayList和copyArrayofList)的引用内容将被添加到列表中,所以如果修改其中的任何一个,则copyArrayofList也将反映相同的变化。

如果您不想要副作用,那么您需要将originalArrayList中的每个元素复制到copyArrayofList,就像使用for或while循环一样。

我有同样的问题ConcurrentAccessException和mysolution是:

 List<SomeBean> tempList = new ArrayList<>(); for (CartItem item : prodList) { tempList.add(item); } prodList.clear(); prodList = new ArrayList<>(tempList); 

所以当时只有一个操作,并避免了执行…

我尝试了类似的东西,并能够重现问题(IndexOutOfBoundsException)。 以下是我的发现:

1)Collections.copy(destList,sourceList)的实现首先通过调用size()方法来检查目标列表的大小。 由于size()方法的调用将总是返回列表中元素的数量(在本例中为0),所以构造函数ArrayList(capacity)只能确保后备数组的初始容量,这与列表的大小。 因此,我们总是得到IndexOutOfBoundsException。

2)一个相对简单的方法是使用以集合为参数的构造函数:

 List<SomeBean> wsListCopy=new ArrayList<SomeBean>(wsList); 

重新: indexOutOfBoundsException ,你的子列表参数是问题; 您需要以大小-1结束子列表。 从零开始,列表的最后一个元素总是大小为1,大小位置中没有元素,因此是错误。

subList函数是一个把戏,返回的对象仍然在原始列表中。 所以如果你在subList中做任何操作,它将会在你的代码中引起并发exception,不pipe是单线程还是multithreading。