java.util.Arrays.asList与removeIf一起使用时抛出UnsupportedOperationException

我准备接下来的2个月进行OCPJP 8考试,目前我已经引起了我的注意,因为我不明白为什么

public class BiPredicateTest { public static void main(String[] args) { BiPredicate<List, Integer> containsInt = List::contains; List ints = java.util.Arrays.asList(1,20,20); ints.add(1); ints.add(20); ints.add(20); System.out.println(containsInt.test(ints, 20)); BiConsumer<List, Integer> listInt = BiPredicateTest::consumeMe; listInt.accept(ints, 15); } public static void consumeMe(List ints, int num) { ints.removeIf(i -> i>num); ints.forEach(System.out::println); } } 

这显然是编译好的! 但是当你运行它时,你会看到这样的exception

 C:\Users\user\Documents>javac BiPredicateTest.java C:\Users\user\Documents>java BiPredicateTest true Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.remove(AbstractList.java:161) at java.util.AbstractList$Itr.remove(AbstractList.java:374) at java.util.Collection.removeIf(Collection.java:415) at BiPredicateTest.consumeMe(BiPredicateTest.java:22) at BiPredicateTest.main(BiPredicateTest.java:17) 

我需要一些帮助来理解为什么asList方法不能与removeIf一起使用? 我假设它将返回一个实现removeIf方法!的ArrayList实例。

任何答案将不胜感激。

干杯!

java.util.Arrays.asList()生成一个列表,从中无法删除元素,因此它会引发删除尝试。

你可以用ArrayList包装它:

 List ints = new java.util.ArrayList<>(java.util.Arrays.asList(1,20,20)); 

更新

Arrays.asList()返回return new ArrayList<>(a); 其中ArrayList不是java.util.ArrayList ,而是java.util.Arrays.ArrayList (内部类),它不允许删除。