我想测试如何获得两个列表之间的交集,这是我的代码:
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)
但我没有做任何删除。为什么这会产生例外?
更新我:
使用:
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));
感谢大家的回答。
答案 0 :(得分:19)
当您使用Arrays.asList
时,您将获得由传入的具有受限功能的实际数组支持的列表。如果需要完全可修改的列表,则必须创建新列表。例如:
List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20));
List<Integer> list2 = new ArrayList<Integer>(list.subList(2, 5));
list.retainAll(list2);
System.out.println(list);
// result: [18, 19, 20]
答案 1 :(得分:3)
正如documentation所说,List.retainAll()
方法
仅保留此列表中包含在指定集合中的元素(可选操作)。换句话说,从此列表中删除所有未包含在指定集合中的元素。 [强调我的]
答案 2 :(得分:1)
retainAll会从调用它的列表中删除项目。
答案 3 :(得分:0)
retainAll会删除所有不在给定列表中的元素。
答案 4 :(得分:0)
文档还说当retain实现不支持此方法时,retainAll会抛出UnsupportedOperationException。