9

我想测试如何获得两个列表之间的交集,这是我的代码:

            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));

谢谢大家的回答。

4

5 回答 5

26

使用 时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]
于 2012-05-10T20:34:43.023 回答
3

正如文档所说,该List.retainAll()方法

仅保留此列表中包含在指定集合中的元素(可选操作)。换句话说,从这个列表中删除所有不包含在指定集合中的元素。[强调我的]

于 2012-05-10T20:34:09.217 回答
1

retainAll确实从调用它的列表中删除项目。

于 2012-05-10T20:32:54.040 回答
0

retainAll 确实删除了所有不在给定列表中的元素。

于 2012-05-10T20:33:52.447 回答
0

文档还说,当 List 实现不支持此方法时,retainAll 会抛出 UnsupportedOperationException。

于 2012-05-10T20:38:19.200 回答