此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂。
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的了.
时间: 2024-10-13 02:59:58