作者:flyhero | 微信公衆號:碼上實戰(ID:Push-Code)
使用Arrays.asList()的原因無非是想將數組或一些元素轉爲集合,而你得到的集合並不一定是你想要的那個集合。
而一開始asList的設計時用於打印數組而設計的,但jdk1.5開始,有了另一個比較更方便的打印函數Arrays.toString(),於是打印不再使用asList(),而asList()恰巧可用於將數組轉爲集合。
一、錯誤用法
如果你這樣使用過,那你可要注意了。
1、錯誤一
將基本類型數組作爲asList的參數
猜一下輸出結果?
2、錯誤二
將數組作爲asList參數後,修改數組或List
猜一下輸出結果?
3、錯誤三
數組轉換爲集合後,進行增刪元素
猜一下輸出結果?
你是不是以爲上面 👆那個 list 是 java.util.ArrayList ?
答案很確定:NO !
二、深入探究
我們通過asList()源碼可發現其原因,但爲了更直觀,我們先通過IDEA debug來看看結果。
其實它返回的是 java.util.Arrays.ArrayList,這個傢伙是誰呢?
請看下源碼:
但它和ArrayList貌似很像唉!有什麼不同嗎?
三、不同之處
Arrays.ArrayList 是工具類 Arrays 的一個內部靜態類,它沒有完全實現List的方法,而 ArrayList直接實現了List 接口,實現了List所有方法。
-
長度不同 和 實現的方法不同
Arrays.ArrayList是一個定長集合,因爲它沒有重寫add,remove方法,所以一旦初始化元素後,集合的size就是不可變的。
-
參數賦值方式不同
Arrays.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的構造參數
七、最後
勿以點小而不聞!體現程序素養或許就在這些小地方,不要給自己或別人留坑。那麼這個知識點,你get到了嗎?
熱門內容: