一.背景:使用工具类 Arrays.asList()把数组转换成集合时,使用其修改集合相关的方
法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。
二.分析:既然是List为何不能进行增删改的操作?
1.Arrays.asList(str)调用的是Arrays类中的asList方法,该方法返回一个ArrayList对象。
2.进入asList方法发现这个ArrayList是Arrays的一个继承AbstractList的静态内部类,根本不是java.util下的ArrayList.也并没有提供add,remove,clear方法。
3.其实Arrays$ArraysList调用add调用的是父类AbstractList中的方法add(E e)
4.父类AbstractList最终调用add(int index,E element),即抛出异常。
5.再看下java.util下的ArrayList,ArrayList跟Arrays$ArrayList同样都继承AbstractList
6.再看下java.util下的ArrayList为啥不会报错呢?因为java.util.ArrayList覆盖了父类中的add方法。所以不会报错
三:总结
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体现的是适配器模式,只是转换接口,后台的数据仍是数组。