千萬不要這樣使用Arrays.asList !

作者: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等等免費學習視頻,持續更新!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章