Java踩坑記系列之Arrays.AsList

java.util.ArraysasList方法能夠方便的將數組轉化爲集合,咱們平時開發在初始化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,但這個ArrayListArrays內部的一個靜態類(java.util.Arrays.ArrayList),並非咱們平時用的java.util.ArrayList只是名字同樣,包名不同:google

file

這個ArrayList也繼承自AbstractList,可是卻沒有實現add()remove()方法用這兩個方法其實調用的是AbstractList的默認方法:code

public void add(int index, E element) {
    throw new UnsupportedOperationException();
}

直接拋出" UnsupportedOperationException"的異常!htm

因此當咱們調用這個ArrayListadd方法時實際上是調用了抽象集合類裏的add方法,就拋出了上面的異常,緣由是數組雖然提供了轉集合的方法, 但本質上仍是個數組,數組的長度是固定的,因此jdk的做者沒有實現add()remove()方法。blog

你們在使用的時候須要注意,要結合具體業務場景判斷:若是隻是對轉成後的集合進行遍歷或使用stream()流操做都沒有問題,能夠正常使用(修改元素也沒問題) 但若是須要新增元素或刪除元素等改變集合長度的操做就要避免,不然報錯就會影響到咱們正常的業務邏輯。繼承

二. 長度問題

仍是ArraysasList(),該方法沒法將一個基本類型的數組轉換成集合List,或者說基本類型雖然能轉換成功,但不是"咱們想要的集合",由於asList方法接收的是一個泛型的變長參數。element

而基本數據類型是沒法被泛型化的,這樣的話對於泛型而言,基本數據類型會被做爲一個"[x"的類型,"["表示這是一個數組,"x"爲當前數組的類型,例如: int[] 實際上它的類型是"[I"開發

file

這樣的話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也是一個本身實現的集合,一樣不支持addremove方法,若是既要保證轉換成list後的數據長度正確又要能增刪操做的話,就用java.util.ArrayList吧。

三. Arrays.asList方法返回的是數組的一個視圖,也就是說對這個list的操做都會反映在原數組上

文章來源:http://javakk.com/132.html

相關文章
相關標籤/搜索