版權聲明:java
本帳號發佈文章均來自公衆號,承香墨影(cxmyDev),版權歸承香墨影全部。數組
每週會統一更新到這裏,若是喜歡,可關注公衆號獲取最新文章。bash
未經容許,不得轉載。ui
若是有對於一些 Array 到 List 轉換的須要的話,可能就須要用到 Arrays 這個類,它除了提供一些對數組的排序和搜索等操做以外,還提供了一些從 Array.asList()
這個很是方便的將 Array 轉爲爲 List 的 Api ,可是它使用起來也有一些須要注意的地方。spa
本篇就簡單介紹一下使用 Arrays 的一些注意事項。3d
asList()
能夠將一個數組轉換爲咱們須要的 List。可是若是這個數組是一個基本數據類型的話,就會出現問題。code
舉個例子:cdn
最終輸出的結果是:blog
I/cxmyDev: list size : 1複製代碼
這個結果和咱們的預期是不符合的,先來看看 asList()
的實現源碼。排序
能夠看到 asList()
是接受一個泛型的變長參數的,而基本數據類型是沒法被泛型化的。而對於泛型而言,基本數據類型,實際上會被人爲是一個 [x 的類型。 [ 表示這是一個數組,x 爲當前數組的類型。例如: int[] 實際上它的類型是 [I 。
舉個例子來講明問題。
I/cxmyDev: list size : 1
I/cxmyDev: list.get(0) class : [I
I/cxmyDev: list type :true複製代碼
能夠看到,確實與前面介紹的一致。
因此,得出的結論就是,8 種基本數據類型,不能被用在方法的泛型變長參數中,否者會被人爲是一個 [X 類型的參數,而不是可變長參數。
有時候又須要對這些基本數據類型進行操做,這個時候,就可使用基本數據類型的包裝類。
簡單改寫一個上面的 Demo。
再來看看輸出的結果,驗證一下。
list size : 6
I/cxmyDev: list.get(0) class : java.lang.Integer
I/cxmyDev: list type :false複製代碼
這樣使用,就和咱們的預期是同樣的了。
前面看了 asList()
的簽名,能夠發現,它返回的是一個 ArrayList 。可是,須要注意的是,這個 ArrayList ,並非咱們常常使用的 ArrayList ,咱們常常使用的 ArrayList 是屬於 java.util 包下面的,而 asList()
返回的只是 Arrays 的一個內部類。
雖然他們同爲 ArrayList 可是從實現和文檔上均可以看到,Arrays.ArrayList()
是一個不可變的 List。它雖然也是繼承自 AbstractList ,可是它只實現了一部分方法,並無實現其中的 add()
、remove()
等用於操做 ArrayList 的方法。
例如上面的代碼,想在 asList()
返回的List 中,再插入一條數據,將會拋出 UnsupportedOperationException 這個異常。
UnsupportedOperationException 這個異常,是在 AbstractList.add() 方法中拋出的。
能夠看到,若是繼承了 AbstractList 而不去實現它對應的方法,調用就會拋出此異常。
若是須要使用 asList()
方法的話,就須要確保轉換出來的 List 將不會再被修改,否者會拋出異常。
而若是想對 Arrays.asList()
轉換的 ArrayList 作操做,就須要再一次對其進行轉換。
Arrays.asList() 使用的坑基本上都已經說清楚了,而且也提供瞭解決的辦法。
版權聲明:
本帳號發佈文章均來自公衆號,承香墨影(cxmyDev),版權歸承香墨影全部。
每週會統一更新到這裏,若是喜歡,可關注公衆號獲取最新文章。
未經容許,不得轉載。