在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()
方法不能使用基本类型数组作为参数,只能使用相应的包装类型数组。