Java 中,Arrays 轉 List 的那些坑

承香墨影發表於2019-03-02

版權宣告:

本賬號釋出文章均來自公眾號,承香墨影(cxmyDev),版權歸承香墨影所有。

每週會統一更新到這裡,如果喜歡,可關注公眾號獲取最新文章。

未經允許,不得轉載。

一、前言

如果有對於一些 Array 到 List 轉換的需要的話,可能就需要用到 Arrays 這個類,它除了提供一些對陣列的排序和搜尋等操作之外,還提供了一些從 Array.asList() 這個非常方便的將 Array 轉為為 List 的 Api ,但是它使用起來也有一些需要注意的地方。

本篇就簡單介紹一下使用 Arrays 的一些注意事項。

二、需要注意什麼

1、asList() 無法將基本型別轉換為List

asList() 可以將一個陣列轉換為我們需要的 List。但是如果這個陣列是一個基本資料型別的話,就會出現問題。

舉個例子:

/arr-demo0.png
/arr-demo0.png

最終輸出的結果是:

I/cxmyDev: list size : 1複製程式碼

這個結果和我們的預期是不符合的,先來看看 asList() 的實現原始碼。

/arr-aslist.png
/arr-aslist.png

可以看到 asList() 是接受一個泛型的變長引數的,而基本資料型別是無法被泛型化的。而對於泛型而言,基本資料型別,實際上會被人為是一個 [x 的型別。 [ 表示這是一個陣列,x 為當前陣列的型別。例如: int[] 實際上它的型別是 [I

舉個例子來說明問題。

/arr-demo1.png
/arr-demo1.png

I/cxmyDev: list size : 1
I/cxmyDev: list.get(0) class : [I
I/cxmyDev: list type :true複製程式碼

可以看到,確實與前面介紹的一致。

所以,得出的結論就是,8 種基本資料型別,不能被用在方法的泛型變長引數中,否者會被人為是一個 [X 型別的引數,而不是可變長引數。

有時候又需要對這些基本資料型別進行操作,這個時候,就可以使用基本資料型別的包裝類。

簡單改寫一個上面的 Demo。

/arr-demo2.png
/arr-demo2.png

再來看看輸出的結果,驗證一下。

list size : 6
I/cxmyDev: list.get(0) class : java.lang.Integer
I/cxmyDev: list type :false複製程式碼

這樣使用,就和我們的預期是一樣的了。

2、asList() 返回的列表是不可變的

前面看了 asList() 的簽名,可以發現,它返回的是一個 ArrayList 。但是,需要注意的是,這個 ArrayList ,並不是我們經常使用的 ArrayList ,我們經常使用的 ArrayList 是屬於 java.util 包下面的,而 asList() 返回的只是 Arrays 的一個內部類。

雖然他們同為 ArrayList 但是從實現和文件上都可以看到,Arrays.ArrayList() 是一個不可變的 List。它雖然也是繼承自 AbstractList ,但是它只實現了一部分方法,並沒有實現其中的 add()remove() 等用於操作 ArrayList 的方法。

/arr-demo3.png
/arr-demo3.png

例如上面的程式碼,想在 asList() 返回的List 中,再插入一條資料,將會丟擲 UnsupportedOperationException 這個異常。

/arr-crash.png
/arr-crash.png

UnsupportedOperationException 這個異常,是在 AbstractList.add() 方法中丟擲的。

/arr-excep.png
/arr-excep.png

可以看到,如果繼承了 AbstractList 而不去實現它對應的方法,呼叫就會丟擲此異常。

如果需要使用 asList() 方法的話,就需要確保轉換出來的 List 將不會再被修改,否者會丟擲異常。

而如果想對 Arrays.asList() 轉換的 ArrayList 做操作,就需要再一次對其進行轉換。

/arr-demo4.png
/arr-demo4.png

三、小結

Arrays.asList() 使用的坑基本上都已經說清楚了,並且也提供瞭解決的辦法。

版權宣告:

本賬號釋出文章均來自公眾號,承香墨影(cxmyDev),版權歸承香墨影所有。

每週會統一更新到這裡,如果喜歡,可關注公眾號獲取最新文章。

未經允許,不得轉載。

公眾號二維碼.jpg
公眾號二維碼.jpg

相關文章