java.util.Arrays
的asList
方法能夠方便的將數組轉化爲集合,咱們平時開發在初始化ArrayList
時使用的比較多,能夠簡化代碼,但這個靜態方法asList()
有幾個坑須要注意:html
一. 若是對集合使用增長或刪除元素的操做將會報錯
以下代碼:java
List list = Arrays.asList("a","b","c"); list.add("d");
輸出結果:數組
Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148) at java.util.AbstractList.add(AbstractList.java:108) at ArraysAsListTest.main(ArraysAsListTest.java:7)
Arrays.asList
的源碼雖然返回的是一個ArrayList
,但這個ArrayList
是Arrays內部的一個靜態類(java.util.Arrays.ArrayList
),並非咱們平時用的java.util.ArrayList
只是名字同樣,包名不同:google
這個ArrayList
也繼承自AbstractList
,可是卻沒有實現add()
,remove()
方法用這兩個方法其實調用的是AbstractList
的默認方法:code
public void add(int index, E element) { throw new UnsupportedOperationException(); }
直接拋出" UnsupportedOperationException
"的異常!htm
因此當咱們調用這個ArrayList
的add
方法時實際上是調用了抽象集合類裏的add
方法,就拋出了上面的異常,緣由是數組雖然提供了轉集合的方法, 但本質上仍是個數組,數組的長度是固定的,因此jdk的做者沒有實現add()
和remove()
方法。blog
你們在使用的時候須要注意,要結合具體業務場景判斷:若是隻是對轉成後的集合進行遍歷或使用stream()流操做都沒有問題,能夠正常使用(修改元素也沒問題) 但若是須要新增元素或刪除元素等改變集合長度的操做就要避免,不然報錯就會影響到咱們正常的業務邏輯。繼承
二. 長度問題
仍是Arrays
的asList()
,該方法沒法將一個基本類型的數組轉換成集合List,或者說基本類型雖然能轉換成功,但不是"咱們想要的集合",由於asList
方法接收的是一個泛型的變長參數。element
而基本數據類型是沒法被泛型化的,這樣的話對於泛型而言,基本數據類型會被做爲一個"[x"的類型,"["表示這是一個數組,"x"爲當前數組的類型,例如: int[] 實際上它的類型是"[I"開發
這樣的話Arrays.asList
傳入的參數是基本類型的話,會把數組當作一個元素處理(長度=1),若是咱們要遍歷List
或獲取List
的長度就不許確了,相似下面的用法:
int array[] = {1,2,3,4,5}; List list = Arrays.asList(array); System.out.println("長度="+list.size()); System.out.println("是否含有元素3="+list.contains(3));
輸出結果:
長度=1 是否含有元素3=false
若是咱們的代碼裏用到了這樣獲取長度或判斷是否包含指定元素的操做就要注意寫法,不然就會影響咱們的邏輯流程!
爲避免這樣的問題出現,有不少種其餘寫法,好比將array轉成包裝類(即引用類型),以下:
Integer array[] = {1,2,3,4,5}; List list = Arrays.asList(array); System.out.println("長度="+list.size()); System.out.println("是否含有元素3="+list.contains(3));
輸出結果:
長度=5 是否含有元素3=true
固然也可使用google的集合類"Ints.asList",以下:
int array[] = {1,2,3,4,5}; List list = Ints.asList(array); System.out.println("長度="+list.size()); System.out.println("是否含有元素3="+list.contains(3));
輸出結果:
長度=5 是否含有元素3=true
可是google的Ints.asList
方法返回的list也是一個本身實現的集合,一樣不支持add
和remove
方法,若是既要保證轉換成list後的數據長度正確又要能增刪操做的話,就用java.util.ArrayList吧。