Arrays.asList()生成的List抛UnsupportedOperationException分析

一.背景:使用工具类 Arrays.asList()把数组转换成集合时,使用其修改集合相关的方java

法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。 数组

二.分析:既然是List为什么不能进行增删改的操做?工具

1.Arrays.asList(str)调用的是Arrays类中的asList方法,该方法返回一个ArrayList对象。spa

 

2.进入asList方法发现这个ArrayList是Arrays的一个继承AbstractList的静态内部类,根本不是java.util下的ArrayList.也并无提供add,remove,clear方法。对象

3.其实Arrays$ArraysList调用add调用的是父类AbstractList中的方法add(E e)blog

 

4.父类AbstractList最终调用add(int index,E element),即抛出异常。继承

5.再看下java.util下的ArrayList,ArrayList跟Arrays$ArrayList一样都继承AbstractList接口

6.再看下java.util下的ArrayList为啥不会报错呢?由于java.util.ArrayList覆盖了父类中的add方法。因此不会报错element

三:总结rem

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> AbstractList是一个List抽象类,继承AbstractCollection,实现List接口,Arrays$ArrayList和java.util.ArrayList都继承AbstractList。

Arrays.asList 的返回对象是一个 Arrays 内部类,并无实现集合的修改方法,add/remove/clear调用的是父类中的方法,而父类中不支持这种操做,除非子类进行覆盖(java.util.ArrayList就进行了覆盖因此不会报错)Arrays.asList体现的是适配器模式,只是转换接口,后台的数据还是数组。 

相关文章
相关标签/搜索