如何将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。