在API中對asList()的描述
public static <T> List<T> asList(T... a)
- 返回由指定數組支持的固定大小的列表。(將返回的列表更改為“寫入數組”。)該方法作為基於數組和基於集合的API之間的橋梁,與
Collection.toArray()
相結合 ,返回的列表是可序列化的,並實現RandomAccess。 - 此方法還提供了一種方便的方式來創建一個初始化為包含幾個元素的固定大小的列表:
List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
- 參數類型
T
- 數組中對象的類 - 參數
a
- 列表將被支持的數組 - 結果
指定數組的列表視圖
在來看一個例子:(參數類型為可變參數的方法,可以傳多個指定類型的值,也可傳指定類型的數組)
import java.util.Arrays;
import java.util.List;
public class TestArrayLIst {
public static void main(String[] args) {
int[] arr = {1,2,3};
List<int[]> asList = Arrays.asList(arr);
System.out.println(asList);
Integer[] arr1 = {1,2,3};
List<Integer> asList2 = Arrays.asList(arr1);
System.out.println(asList2);
}
public static void fun(int... a) {
System.out.println("int...");
}
}/*Output:
[[I@15db9742]
[1, 2, 3]
*/
代碼中我們可以看到,給方法Arrays.asList()
方法傳基本類型int數組時返回的類型為List<int[]>
,當傳int的包裝類型Integer數組時返回的為List<Integer>
。
為什么會這樣呢???(以前一直對這個方法很迷惑)
今天看它的源碼時發現:
可以看到當調用Arrays.asList()
方法時,返回的實際類型是Arrays類中的一個繼承了AbstractList的成員內部類ArrayList
,還是private的。而從Arrays的內部類ArrayList
的構造器中可以看出,構造器所做的是把傳進來的數組賦給ArrayLsit
類中定義的一個不可變數組E[] a
。
用大白話說:Arrays.asList()
的作用就是,把傳進來的可變參數(編譯期把可變參數轉為數組),然后把這個數組賦給ArrayList(內部類)並返回這個ArrayList,而且這個ArrayList中存的數組類型為傳入可變參數的類型。
而在Java中的泛型中,基本數據類型不可以泛型化。但是基本類型的int的數組可以作為泛型的參數化類型,如下列子:
import java.util.ArrayList;
import java.util.List;
public class TestGenerics {
public static void main(String[] args) {
List<int[]> list = new ArrayList<int[]>();
list.add(new int[] {1,2,3});
list.add(new int[] {4,5,6});
for (int[] is : list) {
for (int is2 : is) {
System.out.print(is2+" ");
}
System.out.println();
}
}
}/*Output
1 2 3
4 5 6
*/
因此當傳入基本類型的數組時,程序中是把int[]當做了參數化類型,因此當Arrays.asList()
方法返回的是一個存儲int[]類型的List。所以Arrays.asList()
方法不能使用基本類型數組作為參數,只能使用相應的包裝類型數組。