问题
我有一个从Web服务填充的aList。我想将该列表的内容复制/克隆到相同类型的空列表中。谷歌搜索复制列表建议我使用Collections.copy()方法。在我看到的所有示例中,目标列表应该包含要进行复制的确切项目数。
由于我使用的列表是通过Web服务填充的,它包含数百个对象,我不能使用上述技术。或者我使用它错了?? !!无论如何,为了使它工作,我试图做这样的事情,但我仍然有一个IndexOutOfBoundsException。
List wsList = app.allInOne(template);
List wsListCopy=new ArrayList(wsList.size());
Collections.copy(wsListCopy,wsList);
System.out.println(wsListCopy.size());
我尝试使用wsListCopy=wsList.subList(0, wsList.size())但我在代码中得到了aConcurrentAccessException。命中和审判。 :)
无论如何,我的问题很简单,**如何将列表的整个内容复制到另一个列表中?**当然不是通过迭代。
#1 热门回答(181 赞)
只需使用:
List newList = new ArrayList(otherList);
注意:仍然不是线程安全的,如果你从另一个线程修改otherList,那么你可能想要制作那个otherList(甚至是55247698)aCopyOnWriteArrayList,或者使用一个锁原语,例如ReentrantReadWriteLock来序列化对同时访问的任何列表的读/写访问。
#2 热门回答(21 赞)
这是一个非常好的Java 8方法:
List list2 = list1.stream().collect(Collectors.toList());
当然,这里的优点是你可以过滤并跳过仅列出部分列表的副本。
例如
//don't copy the first element
List list2 = list1.stream().skip(1).collect(Collectors.toList());
#3 热门回答(6 赞)
我试图做这样的事情,但我仍然有一个IndexOutOfBoundsException。我收到了ConcurrentAccessException
这意味着你在尝试复制列表时正在修改列表,很可能是在另一个线程中。要解决这个问题,你必须要么
使用专为并发访问而设计的集合。
适当地锁定集合,以便你可以迭代它(或允许你调用为你执行此操作的方法)
找一个离开,以避免需要复制原始列表。