
5.2 Arrays类
java.util.Arrays类定义了若干静态方法对数组操作,包括对数组排序、在已排序的数组中查找指定元素、复制数组元素、比较两个数组是否相等、将一个值填充到数组的每个元素中。上述操作都有多个重载的方法,可用于所有的基本数据类型和Object类型。
5.2.1 数组的排序
使用Arrays的sort()方法可以对数组元素排序。使用该方法的排序是稳定的(stable),即相等的元素在排序结果中不会改变顺序。对于基本数据类型,按数据的升序排序。对于对象数组的排序要求数组元素的类必须实现Comparable接口,若要改变排序顺序,还可以指定一个比较器对象。整型数组和对象数组的排序方法格式如下:
- public static void sort(int[] a):对数组a按自然顺序排序。
- public static void sort(int[] a, int fromIndex, int toIndex):对数组a中的元素从起始下标fromIndex到终止下标toIndex之间的元素排序。
- public static void sort(Object[] a):对数组a按自然顺序排序。
- public static void sort(Object[] a, int fromIndex, int toIndex):对数组a中的元素从起始下标fromIndex到终止下标toIndex之间的元素排序。
- public static <T>void sort(T[] a, Comparator <?super T>c):使用比较器对象c对数组a排序。
注意:不能对布尔型数组排序。
下面代码演示了对一个字符串数组的排序,对字符串排序是按字符的Unicode码排序的。

代码输出结果为:

5.2.2 元素的查找
对排序后的数组可以使用binarySearch()方法从中快速查找指定元素,该方法也有多个重载的方法。下面是对整型数组和对象数组的查找方法:
- public static int binarySearch (int[] a, int key);
- public static int binarySearch (Object[] a, Object key)。
查找方法根据给定的键值,查找该值在数组中的位置,如果找到指定的值,则返回该值的下标值。如果查找的值不包含在数组中,方法的返回值为(−插入点−1)。插入点为指定的值在数组中应该插入的位置。
例如,下面代码输出结果为−3。

注意:使用binarySearch()方法前,数组必须已经排序。
5.2.3 数组元素的复制
使用Arrays类的copyOf()方法和copyOfRange()方法将一个数组中的全部或部分元素复制到另一个数组中。有10个重载的copyOf()方法,其中8个为各基本类型的,2个为对象类型的。下面给出几个方法的格式。
- public static boolean[] copyOf(boolean[] original,int newLength);
- public static double[] copyOf(double[] original, int newLength);
- public static <T> T[] copyOf(T[] original, int newLength)。
这些方法的original参数是原数组,newLength参数是新数组的长度。如果newLength小于原数组的长度,则将原数组的前面若干元素复制到目标数组。如果newLength大于原数组的长度,则将原数组的所有元素复制到目标数组,目标数组的长度为newLength。
下面代码创建了一个包含4个元素的数组,将numbers的内容复制到它的前三个元素中。

当然,也可以将新数组重新赋给原来的变量:

与copyOf()类似的另一个方法是copyOfRange(),它可以将原数组中指定位置开始的若干元素复制到目标数组中。下面是几个方法的格式。
- public static boolean[] copyOfRange (boolean[] original,int from, int to);
- public static double[] copyOfRange (double[] original, int from, int to);
- public static <T> T[] copyOfRange (T[] original, int from, int to)。
上述方法中,from参数指定复制的元素在原数组中的起始下标,to参数是结束下标(不包含),将这些元素复制到目标数组中。

上述代码执行后,letter数组的长度变为4,包含'b'、'c'、'd'和'e'等4个元素。
5.2.4 填充数组元素
调用Arrays类的fill()方法可以将一个值填充到数组的每个元素中,也可将一个值填充到数组的几个连续元素中。下面是向整型数组和对象数组中填充元素的方法:
- public static void fill (int[] a, int val):用指定的val值填充数组a中的每个元素。
- public static void fill (int[] a, int fromIndex, int toIndex, int val):用指定的val值填充数组中的下标从fromIndex开始到toIndex为止的每个元素。
- public static void fill (Object[] a, Object val):用指定的val值填充对象数组中的每个元素。
- public static void fill (Object[] a, int fromIndex, int toIndex, Object val):用指定的val值填充对象数组中的下标从fromIndex开始到toIndex为止的每个元素。
下面代码创建一个整型数组,然后使用fill()方法为其每个元素填充一个两位随机整数。

下面是该程序某次输出结果为:

5.2.5 数组的比较
使用Arrays的equals()方法可以比较两个数组,被比较的两个数组要求数据类型相同且元素个数相同,比较的是对应元素是否相同。对于引用类型的数据,如果两个对象e1、e2值都为null或e1.equals(e2),则认为e1与e2相等。
下面是布尔型数组和对象数组equals()方法的格式:
- public static boolean equals(boolean[] a, boolean[] b):比较布尔型数组a与b是否相等。
- public static boolean equals(Object[] a, Object[] b):比较对象数组a与b是否相等。
下面的程序给出了equals()方法的示例。
程序5.7 EqualsTest.java

使用数组对象的equals()方法用来比较两个引用是否相同。使用Arrays类的equals()方法用来比较两个数组对应元素是否相同。
提示:除上述讨论的方法外,Arrays类中还提供了其他对数组操作的方法,请读者参考Java API文档。