使用Arrays.asList()的原因無非是想將數組或一些元素轉為集合,而你得到的集合並不一定是你想要的那個集合。
而一開始asList的設計時用於打印數組而設計的,但jdk1.5開始,有了另一個比較更方便的打印函數Arrays.toString(),於是打印不再使用asList(),而asList()恰巧可用於將數組轉為集合。
一、錯誤用法
如果你這樣使用過,那你可要注意了。
1、錯誤一
將基本類型數組作為asList的參數
2、錯誤二
將數組作為asList參數后,修改數組或List
3、錯誤三
數組轉換為集合后,進行增刪元素
其實重點是這個List並不是我們常用的java.util.ArrayList,而是Arrays的自己私有內部類
三、不同之處
Arrays.ArrayList 是工具類 Arrays 的一個內部靜態類,它沒有完全實現List的方法,而 ArrayList直接實現了List 接口,實現了List所有方法。
-
長度不同 和 實現的方法不同
Arrays.ArrayList是一個定長集合,因為它沒有重寫add,remove方法,所以一旦初始化元素后,集合的size就是不可變的。
-
參數賦值方式不同
Arrays.ArrayList將外部數組的引用直接通過“=”賦予內部的泛型數組,所以本質指向同一個數組。使用Objects工具類賦值不為空的對象。
java.util.ArrayList ArrayList是將其他集合轉為數組后copy到自己內部的數組的。
四、揭曉答案
1、錯誤一
由於Arrays.ArrayList參數為可變長泛型,而基本類型是無法泛型化的,所以它把int[] arr數組當成了一個泛型對象,所以集合中最終只有一個元素arr。
2、錯誤二
由於asList產生的集合元素是直接引用作為參數的數組,所以當外部數組或集合改變時,數組和集合會同步變化,這在平時我們編碼時可能產生莫名的問題。
3、錯誤三
由於asList產生的集合並沒有重寫add,remove等方法,所以它會調用父類AbstractList的方法,而父類的方法中拋出的卻是異常信息。
五、支持基礎類型的方式
1、如果使用Spring
2、如果使用Java 8
六、數組轉ArrayList
1、遍歷轉換
顯然這種方式不夠優雅!反正我不願意使用。
2、使用工具類
上面方案不夠優雅,那么這種相對來說優雅一些。
你以為這種還不錯?
too young too simple!
addAll()方法的實現就是用的上面遍歷的方式。
3、如果使用Java 8
既可以用於基本類型也可以返回想要的集合。
4、兩個集合類結合
將Arrays.asList返回的集合作為ArrayList的構造參數