在调用 Arrays.asList(T… a) 生成的 List 的 remove 方法删除元素时,会报异常:
public static void main(String [] a) {
List<Integer> integers = Arrays.asList(1,2,3,4,5,6);
// remove操作:java.lang.UnsupportedOperationException
integers.removeIf(n -> n < 4);
integers.forEach(System.out::println);
}
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)
解决:
使用 Arrays.asList(T… a) 生成的 List 做参数重新构造一个 java.util.ArrayList 即可解决此问题
public static void main(String [] a) {
List<Integer> integers = Arrays.asList(1,2,3,4,5,6);
// 构建一个新的List
List<Integer> newList = new ArrayList<>(integers);
newList.removeIf(n -> n < 4);
newList.forEach(System.out::println);
}
原因:
java.util.Arrays.ArrayList 和 java.util.ArrayList 实现的接口不同
- java.util.ArrayList实现了java.util.List接口
- java.util.Arrays.ArrayList继承的java.util.AbstractList方法没有实现java.util.List接口中remove方法的逻辑
如下,Arrays 中的 ArrayList 继承了 AbstractList

我们进入 AbstractList 抽象类,查看它的 add() 和 remove() 方法

代码中已经很清楚了,直接 throw new UnsupportedOperationException();
当使用Arrays.asList()创建的List尝试执行remove操作时,会抛出UnsupportedOperationException。这是因为Arrays$ArrayList没有实现remove方法。解决办法是将Arrays.asList()生成的List转换为ArrayList。问题源于Arrays$ArrayList与ArrayList虽然名字相似,但实现的接口不同,前者不支持修改操作。了解这些差异对于避免此类异常至关重要。

3496

被折叠的 条评论
为什么被折叠?



