java之Arrays.asList


使用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的構造參數

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM