Java-Arrays类-Arrays.asList,方法详解

此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂。

Arrays.asList() 是将数组作为列表来查看的方法,值得注意的是:

public class Test {
    
    public static void main(String[] args) {
        
        int[] a = new int[]{1,2,3,4,5,6,7,8};
        List list1 = Arrays.asList(a);
        System.out.println(list1.size());  //1
    
        Integer[] b = new Integer[] {1,2,3,4,5,6,8};
        List list2 = Arrays.asList(b);
        System.out.println(list2.size());  //7
        
    }
}

期望的输出是 list里面也有7个元素,也就是size为7,然而结果是1。说明编译器对Integer[] 处理不一样。Integer是可变长参数。传入过程中asList()方法实际是将Integer数组里的元素进行存储。

原因:在Arrays.asList中,该方法接受一个变长参数,一般可看做数组参数,但是因为int[] 本身就是一个类型,所以a变量作为参数传递时,编译器认为只传了一个变量,这个变量的类型是int数组,所以size为1,相当于是List中数组的个数。基本类型是不能作为泛型的参数,按道理应该使用包装类型,但这里缺没有报错,因为数组是可以泛型化的,所以转换后在list中就有一个类型为int的数组 ,返回一个受指定数组支持的固定大小的列表。

方法源代码:

 @SafeVarargs
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

最后提醒,如果Integer[]数组没有赋值的话,默认是null,而不是像int[]数组默认是0。

public class Test2 {
    
    public static void main(String[] args) {
        Week[] weeks  = {Week.sun,Week.mon,Week.tue,Week.wed,Week.thu,Week.fri};
        List list = Arrays.asList(weeks);
        list.add(Week.sat);
        System.out.println(list.size());
    }

}

enum Week{
    sun,mon,tue,wed,thu,fri,sat
}
注意这里用add会出错,因为是arrays.aslist中,看代码可以看到这里返回的ArrayList不是原来的传统意义上的java.util.arraylist了,而是自己工具类的一个静态私有内部类,并没有提供add方法,要自己实现,
所以这里是出错了,因此,除非确信array.aslist后长度不会增加,否则谨慎使用:List abc=Arrays.asList("a","b","c"),因为这样的长度是无法再add的了.