一.背景:使用工具類 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體現的是適配器模式,只是轉換接口,後臺的數據還是數組。