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的了.