天天看點

千萬不要這樣使用Arrays.asList !一、錯誤用法二、深入探究三、不同之處四、揭曉答案五、支援基礎類型的方式六、數組轉ArrayList七、最後

作者:flyhero | 微信公衆号:碼上實戰(ID:Push-Code)

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

而一開始asList的設計時用于列印數組而設計的,但jdk1.5開始,有了另一個比較更友善的列印函數Arrays.toString(),于是列印不再使用asList(),而asList()恰巧可用于将數組轉為集合。

一、錯誤用法

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

1、錯誤一

将基本類型數組作為asList的參數

千萬不要這樣使用Arrays.asList !一、錯誤用法二、深入探究三、不同之處四、揭曉答案五、支援基礎類型的方式六、數組轉ArrayList七、最後

猜一下輸出結果?

2、錯誤二

将數組作為asList參數後,修改數組或List

千萬不要這樣使用Arrays.asList !一、錯誤用法二、深入探究三、不同之處四、揭曉答案五、支援基礎類型的方式六、數組轉ArrayList七、最後

猜一下輸出結果?

3、錯誤三

數組轉換為集合後,進行增删元素

千萬不要這樣使用Arrays.asList !一、錯誤用法二、深入探究三、不同之處四、揭曉答案五、支援基礎類型的方式六、數組轉ArrayList七、最後

猜一下輸出結果?

你是不是以為上面 ?那個 list 是 java.util.ArrayList ?

答案很确定:NO !

千萬不要這樣使用Arrays.asList !一、錯誤用法二、深入探究三、不同之處四、揭曉答案五、支援基礎類型的方式六、數組轉ArrayList七、最後

二、深入探究

我們通過asList()源碼可發現其原因,但為了更直覺,我們先通過IDEA debug來看看結果。

千萬不要這樣使用Arrays.asList !一、錯誤用法二、深入探究三、不同之處四、揭曉答案五、支援基礎類型的方式六、數組轉ArrayList七、最後
千萬不要這樣使用Arrays.asList !一、錯誤用法二、深入探究三、不同之處四、揭曉答案五、支援基礎類型的方式六、數組轉ArrayList七、最後

其實它傳回的是 java.util.Arrays.ArrayList,這個家夥是誰呢?

千萬不要這樣使用Arrays.asList !一、錯誤用法二、深入探究三、不同之處四、揭曉答案五、支援基礎類型的方式六、數組轉ArrayList七、最後

請看下源碼:

千萬不要這樣使用Arrays.asList !一、錯誤用法二、深入探究三、不同之處四、揭曉答案五、支援基礎類型的方式六、數組轉ArrayList七、最後

但它和ArrayList貌似很像唉!有什麼不同嗎?

三、不同之處

Arrays.ArrayList 是工具類 Arrays 的一個内部靜态類,它沒有完全實作List的方法,而 ArrayList直接實作了List 接口,實作了List所有方法。

千萬不要這樣使用Arrays.asList !一、錯誤用法二、深入探究三、不同之處四、揭曉答案五、支援基礎類型的方式六、數組轉ArrayList七、最後
  • 長度不同 和 實作的方法不同

    Arrays.ArrayList是一個定長集合,因為它沒有重寫add,remove方法,是以一旦初始化元素後,集合的size就是不可變的。

  • 參數指派方式不同

Arrays.ArrayList将外部數組的引用直接通過“=”賦予内部的泛型數組,是以本質指向同一個數組。

千萬不要這樣使用Arrays.asList !一、錯誤用法二、深入探究三、不同之處四、揭曉答案五、支援基礎類型的方式六、數組轉ArrayList七、最後

ArrayList是将其他集合轉為數組後copy到自己内部的數組的。

千萬不要這樣使用Arrays.asList !一、錯誤用法二、深入探究三、不同之處四、揭曉答案五、支援基礎類型的方式六、數組轉ArrayList七、最後

四、揭曉答案

1、錯誤一

由于Arrays.ArrayList參數為可變長泛型,而基本類型是無法泛型化的,是以它把int[] arr數組當成了一個泛型對象,是以集合中最終隻有一個元素arr。

2、錯誤二

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

3、錯誤三

由于asList産生的集合并沒有重寫add,remove等方法,是以它會調用父類AbstractList的方法,而父類的方法中抛出的卻是異常資訊。

五、支援基礎類型的方式

1、如果使用Spring

千萬不要這樣使用Arrays.asList !一、錯誤用法二、深入探究三、不同之處四、揭曉答案五、支援基礎類型的方式六、數組轉ArrayList七、最後

2、如果使用Java 8

千萬不要這樣使用Arrays.asList !一、錯誤用法二、深入探究三、不同之處四、揭曉答案五、支援基礎類型的方式六、數組轉ArrayList七、最後

六、數組轉ArrayList

1、周遊轉換

千萬不要這樣使用Arrays.asList !一、錯誤用法二、深入探究三、不同之處四、揭曉答案五、支援基礎類型的方式六、數組轉ArrayList七、最後

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

2、使用工具類

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

千萬不要這樣使用Arrays.asList !一、錯誤用法二、深入探究三、不同之處四、揭曉答案五、支援基礎類型的方式六、數組轉ArrayList七、最後

你以為這種還不錯?

too young too simple!

addAll()方法的實作就是用的上面周遊的方式。

3、如果使用Java 8

既可以用于基本類型也可以傳回想要的集合。

千萬不要這樣使用Arrays.asList !一、錯誤用法二、深入探究三、不同之處四、揭曉答案五、支援基礎類型的方式六、數組轉ArrayList七、最後

4、兩個集合類結合

将Arrays.asList傳回的集合作為ArrayList的構造參數

千萬不要這樣使用Arrays.asList !一、錯誤用法二、深入探究三、不同之處四、揭曉答案五、支援基礎類型的方式六、數組轉ArrayList七、最後

七、最後

勿以點小而不聞!展現程式素養或許就在這些小地方,不要給自己或别人留坑。那麼這個知識點,你get到了嗎?

熱門内容:

1、2019年程式員聯考真題新鮮出爐!看看你能得幾分!

2、從開源小白到 Apache Member,我的成長之路!

3、GitHub 五萬星登頂,指令行的藝術!

4、19 個強大、有趣、好玩、又裝B的 Linux 指令!

5、如何正确通路Redis中的海量資料?服務才不會挂掉!

6、為什麼有些大公司技術弱爆了?

7、必會的55個Java性能優化細節!一網打盡!

8、面試題:InnoDB中一棵B+樹能存多少行資料?

千萬不要這樣使用Arrays.asList !一、錯誤用法二、深入探究三、不同之處四、揭曉答案五、支援基礎類型的方式六、數組轉ArrayList七、最後

【視訊福利】2T免費學習視訊,搜尋或掃描上述二維碼關注微信公衆号:Java後端技術(ID: JavaITWork),和20萬人一起學Java!回複:1024,即可免費擷取!内含SSM、Spring全家桶、微服務、MySQL、MyCat、叢集、分布式、中間件、Linux、網絡、多線程,Jenkins、Nexus、Docker、ELK等等免費學習視訊,持續更新!