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體現的是適配器模式,只是轉換接口,後臺的數據還是數組。 

相關文章
相關標籤/搜索