1. 程式人生 > 實用技巧 >java Arrays.asList() 陣列轉集合

java Arrays.asList() 陣列轉集合

主要作用:將陣列轉化為List

使用Arrays.asList()的原因無非是想將陣列或一些元素轉為集合,而你得到的集合並不一定是你想要的那個集合。

而一開始asList的設計時用於列印陣列而設計的,但jdk1.5開始,有了另一個比較更方便的列印函式Arrays.toString(),於是列印不再使用asList(),而asList()恰巧可用於將陣列轉為集合。

錯誤一

如果你這樣使用過,那你可要注意了。

將基本型別陣列作為asList的引數

int[] arr = {1,2,3};    
List list = Arrays.asList(arr);    
System.out.println(list.size());

由於Arrays.ArrayList引數為可變長泛型,而基本型別無法泛型化的,所以它把int[] arr陣列當成了一個泛型物件,所以集合中最終只有一個元素arr。

錯誤二

將陣列作為asList引數後,修改陣列或List

String[] arr = {"歡迎","關注","Java"};    
List list = Arrays.asList(arr);    
arr[1] = "愛上";    
list.set(2,"");    
System.out.println(Arrays.toString(arr));    
System.out.println(list.toString());

由於asList產生的集合元素是直接引用作為引數的陣列,所以當外部陣列或集合改變時陣列和集合會同步變化,這在平時我們編碼時可能產生莫名的問題。

錯誤三

陣列轉換為集合後,進行增刪元素

String[] arr = {"歡迎","關注","Java"};    
List list = Arrays.asList(arr);    
list.add("新增");    
list.remove("關注");    
System.out.println(list.toString());

由於asList產生的集合並沒有重寫add,remove等方法,所以它會呼叫父類AbstractList的方法,而父類的方法中丟擲的卻是異常資訊。

解釋:

其實該方法返回的,不是我們以為的集合 ArrayList, 而是 Arrays的一個靜態內部類java.util.Arrays.ArrayList

Arrays.ArrayList 是工具類 Arrays 的一個內部靜態類,它沒有完全實現List的方法,索引不支援add,remove等這些方法

而正常的ArrayList直接實現了List 介面,實現了List所有方法。

一些常見的陣列轉集合的用法

支援基本型別的方法

1 如果使用Spring

int[]  a = {1,2,3};    
List list = CollectionUtils.arrayToList(a);    
System.out.println(list);

2 如果使用Java 8

int intArray[] = {1, 2, 3};    
List  iList = Arrays.stream(intArray)    
                            .boxed()    
                            .collect(Collectors.toList());    
System.out.println(iList);

陣列轉ArrayList

1遍歷轉換

Integer intArray[] = {1, 2, 3};    
ArrayList<Integer> aList = new ArrayList<>();    
for (Integer i: intArray){    
    aList.add(i);    
}

顯然這種方式不夠優雅!反正我不願意使用。

2 使用工具類

上面方案不夠優雅,那麼這種相對來說優雅一些。

List list = new ArrayList();     
Collections.addAll(list, "welcome", "to", "china");

其實它內部實現機制,也是遍歷元素,一個個往集合里加

3 兩個集合類結合

將Arrays.asList返回的集合作為ArrayList的構造引數

ArrayList arrayList = new ArrayList(Arrays.asList("welcome", "to", "china"));

當然此處肯定不能是基本型別的陣列了(asList入倉得可以轉為泛型),非基本型別都可以