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入倉得可以轉為泛型),非基本型別都可以