我想测试如何获取两个列表的交集,这是我的代码:
List<Integer> list = Arrays.asList(16, 17, 18, 19, 20);
List<Integer> list2 = list.subList(2, 5);
System.out.println(list.subList(2, 5));
System.out.println(list.containsAll(list.subList(2, 5)));
System.out.println(list.retainAll(list2));
这将产生:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.remove(Unknown Source)
at java.util.AbstractList$Itr.remove(Unknown Source)
at java.util.AbstractCollection.retainAll(Unknown Source)
at gov.noaa.nhc.App.main(App.java:48)
但我并没有执行任何删除操作。为什么会出现异常?
更新 I:
使用:
List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20));
List<Integer> list2 = list.subList(2, 5);
生成:
java.util.ConcurrentModificationException
由于list2是由list1支持的,因此从list1中删除项目会导致此异常。最终工作版本:
List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20));
List<Integer> list2 = Arrays.asList(18, 19, 20);
或者List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20));
List<Integer> list2 = new ArrayList<Integer>(Arrays.asList(18, 19, 20));
或者 List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20));
List<Integer> list2 = new ArrayList<Integer>(list.subList(2, 5));
大家的回答都很感谢。
retainAll
操作,则会抛出UnsupportedOperationException
异常。 - user845279subList()
函数。list2
是由list
支持的。retainAll
函数使用迭代器来删除非交集值 - 这会导致ConcurrentModificationException
。您可以在 Javadocs 上阅读有关Iterator
和并发修改的内容。 - user845279List<Integer> list2 = new ArrayList<Integer>(list.subList(2, 5));
- user845279