版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_41751625/article/details/79945398
先来一段代码,引出一个问题。
public class Test {
public static void main(String[] args) {
List list1= Arrays.asList(1,2);
List list2=Arrays.asList(1,2,3,4);
list2.removeAll(list1);
}
}
那么这段代码运行之后,会抛出一个异常
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.AbstractCollection.removeAll(AbstractCollection.java:373)
at Test.main(Test.java:17)
为什么会报这个错,误呢,其实要说明这个问题就得从源码来说起了。其实Arrays.asList其实返回的并不是我们所熟知的ArrayList,而是Arrays内部的一个自己定义的一个ArrayList,它和我们平常使用的ArrayList一样都继承 了AbstractList接口,在AbstractList中,默认remove就是会抛出一个异常,不做其他任何的处理。
public E remove(int index) {
throw new UnsupportedOperationException();
}
因为我们的ArrayList重写了这个remove方法,而Arrays内部的ArrayList并没有重写这个方法,所以会调用父类的这个方法也就直接抛出了一个异常了。