Arrays是JDK自带的一个数组辅助工具类。位于java.util包下
该类有以下特点:
1.无法被创建对象
2.大部分都是静态方法(好像画蛇添足了,hh)
下面着重讲解asList方法
首先看看源码:
@SafeVarargs public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }
源码很简洁,就是给你创建了一个ArrayList,把该数组作为参数传递进去。
其实ArrayList底层就是数组。
再深入看看ArrayList中该构造方法
很奇怪Arrays类里面自己有一个私有的静态类
该构造方法
ArrayList(E[] array) { if (array==null) throw new NullPointerException(); a = array; }
这个也很简洁,直接把传递过来的数组给自己的数组a
可是这个Arrays$ArrayList和java.util.ArrayList有什么区别呢?
借用百度知道heptnaol网友的回答:
不一样,前者只是为了序列化写的一个内部类,只有一个参数为数组的构造函数,且没有add方法,这表示它不能动态扩展内部存储的数组。
好,我们测试一下asList方法
int[] a1 = new int[]{1,2,3};// 一维数组 int[] a2 = new int[]{1,2,3,4};// 一维数组 int[][] a3 = new int[][]{{1,2,3},{0,2,3},{2,2,3}};// 二维数组 String[] a4 = new String[]{"abc","xyz","kpl"};// 字符串数组 Object[] a5 = new Object[]{new String("123"),new String("123"),new String("123")};// Object数组 System.out.println(Arrays.asList(a1)); System.out.println(Arrays.asList(a2)); System.out.println(Arrays.asList(a3)); System.out.println(Arrays.asList(a4)); System.out.println(Arrays.asList(a5));
结果如下:
[[I@82764b]
[[I@12452e8]
[[I@1bf3d87, [I@60991f, [I@1e4f7c2]
[abc, xyz, kpl]
[123, 123, 123]
那么问题来了,为什么int数组传递进入asList打印仍然是一个数组的地址呢?
由于int不是类,所以和T(Type,java类)无法匹配,所以编译器将int[]作为参数传递,所以无法解析该数组。
而String数组和Object数组都是装的对象,所以可以被可变参数拆解成数组。并赋给a数组
不懂?ok,画个图形如一下。
关于这个Arrays中的内部类ArrayList目前仍然有不解的地方,JDK开发者为什么要这样设计?还有RandomAccess接口有什么含义?我将在下一节为大家讲解,谢谢。