列出retainAll异常

Gan*_*row 9 java exception list sublist

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

            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));
Run Code Online (Sandbox Code Playgroud)

这会产生:

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)
Run Code Online (Sandbox Code Playgroud)

但我没有做任何删除.为什么这会产生例外?

更新I:

使用:

List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20));
List<Integer> list2 = list.subList(2, 5);
Run Code Online (Sandbox Code Playgroud)

产品:

java.util.ConcurrentModificationException
Run Code Online (Sandbox Code Playgroud)

由于list2由list1支持,因此从list1中删除项将导致此异常.最后工作版:

List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20));
List<Integer> list2 = Arrays.asList(18, 19, 20);
Run Code Online (Sandbox Code Playgroud)

要么

List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20));
List<Integer> list2 = new ArrayList<Integer>(Arrays.asList(18, 19, 20));
Run Code Online (Sandbox Code Playgroud)

要么

 List<Integer> list = new ArrayList<Integer>(Arrays.asList(16, 17, 18, 19, 20));
 List<Integer> list2 = new ArrayList<Integer>(list.subList(2, 5));
Run Code Online (Sandbox Code Playgroud)

感谢大家的回答.

ata*_*lor 21

使用时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]
Run Code Online (Sandbox Code Playgroud)