2.1 集合工具类的重要类——Arrays类

Java. util. Arrays类是JDK提供的一个工具类,用来处理数组的各种方法,而且每个方法基本上都是静态方法,能直接通过类名Arrays调用。

2.1.1 asList方法

该方法的作用是返回由指定数组支持的固定大小列表。

注意:

这个方法返回的ArrayList不是常用的集合类Java. util. ArrayList。这里的ArrayList是Arrays的一个内部类Java. util. Arrays. ArrayList。这个内部类有如下属性和方法:

1)返回的ArrayList数组是一个定长列表,只能对其进行查看或者修改,但是不能进行添加或者删除操作。

如果对其进行增加或者删除操作,都会调用其父类AbstractList对应的方法,而追溯父类的方法最终会抛出UnsupportedOperationException异常。代码如下:

2)用类型的数组和基本类型的数组区别。

上面的结果第一个listStr. size()= =3,而第二个listI. size()= =1。这是为什么呢?

在Arrays. asList源码中,方法声明为<T>List<T>asList(T. . . a)。该方法接收一个可变参数,并且这个可变参数类型是作为泛型的参数。基本数据类型是不能作为泛型的参数的,但是数组是引用类型,所以数组是可以泛型化的,于是int []作为整个参数类型,而不是int作为参数类型。

所以将上面的方法泛型化补全,代码如下。

3)返回的列表ArrayList里面的元素都是引用,不是独立出来的对象。

这里的Arrays. toString()方法就是打印数组的内容,后面会介绍。这里修改集合的内容,原数组的内容也发生变化了,所以这里传入的是引用类型。

4)已知数组数据,如何快速获取一个可进行增删改查的列表List?

这里的ArrayList集合类后面会详细讲解,目前只需要知道有这种用法即可。

5)Arrays. asList()方法使用场景。

Arrays工具类提供了一个方法asList,使用该方法可以将一个变长参数或者数组转换成List。但是,生成的List的长度是固定的;能够进行修改操作(比如修改某个位置的元素);不能执行影响长度的操作(如add、remove等操作),否则会抛出UnsupportedOperationException异常。

所以Arrays. asList比较适合那些已经有数组数据或者一些元素,而需要快速构建一个List,只用于读取操作,而不进行添加或删除操作的场景。

2.1.2 sort方法

该方法是用于数组排序,在Arrays类中有该方法的一系列重载方法,它能对7种基本数据类型,包括byte、char、double、float、int、long、short进行排序,还有Object类型(实现了Comparable接口)以及比较器Comparator。

1. 基本类型数组

这里以int[]为例:

通过调用sort(int[] a)方法,将原数组按照升序的顺序排列。下面通过源码来看如何实现排序,sort方法代码如下所示。

在Arrays. sort方法内部调用DualPivotQuicksort. sort方法,这个方法的源码很长,分别对于数组的长度进行了各种算法的划分,包括快速排序、插入排序、冒泡排序等。读者可以在源码当中认真阅读。

2. 对象类型数组

该类型的数组进行排序可以实现Comparable接口,重写compareTo方法进行排序。

String类型实现了Comparable接口,内部的compareTo方法是按照字典码进行比较的。

3. Comparator自定义排序

没有实现Comparable接口的,可以通过Comparator实现排序。

2.1.3 binarySearch方法

用binarySearch方法查找数组中的某个元素。该方法和sort方法一样,适用于各种基本数据类型以及对象。

注意:

binarySearch方法是对已经有序的数组进行查找(比如先用Arrays. sort()进行排序,然后调用此方法进行查找)。找到元素返回下标,没有则返回 -1。

实例代码如下:

具体源码实现如下:

2.1.4 copyOf方法

copyOf方法用于拷贝数组元素。底层采用System. arraycopy()实现,这是一个native方法。

src:源数组;

srcPos:源数组要复制的起始位置;

dest:目的数组;

destPos:目的数组放置的起始位置;

length:复制的长度。

注意:

src和dest都必须是同类型或者可以进行转换类型的数组。

2.1.5 equals和deepEquals方法

1. equals

equals用来比较两个数组中对应位置的每个元素是否相等。

equals对8种基本数据类型以及对象都能进行比较。

先看int类型的数组比较,源码实现如下:

再看对象数组的比较:

上述代码也是通过equals来判断。

2. deepEquals

该方法也是用来比较两个数组的元素是否相等,不过deepEquals能够比较多维数组,而且是任意层次的嵌套数组。

2.1.6 fill方法

该方法用于给数组赋值,并能指定某个赋值范围。

2.1.7 toString和deepToString方法

toString用来打印一维数组的元素,而deepToString用来打印多层次嵌套的数组元素。