Java中Arrays工具类详解

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接口有什么含义?我将在下一节为大家讲解,谢谢。

原文地址:https://www.cnblogs.com/dingjm01/p/8335055.html