作者: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到了嗎?
熱門内容:
1、2019年程式員聯考真題新鮮出爐!看看你能得幾分!
2、從開源小白到 Apache Member,我的成長之路!
3、GitHub 五萬星登頂,指令行的藝術!
4、19 個強大、有趣、好玩、又裝B的 Linux 指令!
5、如何正确通路Redis中的海量資料?服務才不會挂掉!
6、為什麼有些大公司技術弱爆了?
7、必會的55個Java性能優化細節!一網打盡!
8、面試題:InnoDB中一棵B+樹能存多少行資料?
【視訊福利】2T免費學習視訊,搜尋或掃描上述二維碼關注微信公衆号:Java後端技術(ID: JavaITWork),和20萬人一起學Java!回複:1024,即可免費擷取!内含SSM、Spring全家桶、微服務、MySQL、MyCat、叢集、分布式、中間件、Linux、網絡、多線程,Jenkins、Nexus、Docker、ELK等等免費學習視訊,持續更新!