Arrays类位于java.util包,它是一个数组工具类,可以帮助程序员完成一些对数组常见的操作。这些常见的操作包括对数组元素排序,从数组中查找特定的元素、比较两个数组元素是不是相同,对数组进行复制等。下面的表11-9展示了Arrays类对数组操作的常用方法。
表11-9 Arrays类操作数组的常用方法
方法 | 作用 |
---|---|
int binarySearch(a,key) | 用二分查找的方式找到a数组中的元素key |
void sort(a) | 对数组a完成排序(升序排列) |
void parallelSort(a) | 对数组a完成并行排序(升序排列) |
String toString(a) | 把a数组转换为字符串 |
copyOf(a,int length) | 复制a数组(复制的长度为length) |
void fill(a,key) | 以元素key填充数组a |
boolean equals(a,b) | 比较数组a和b是否相同(元素一一对应比较) |
int mismatch(a,b) | 找到a、b两个数组中第一对儿不相等元素的位置 |
int compare(a,b) | 判断a、b两个数组中第一对儿不相等元素的大小关系 |
deepEquals(a,b) | 深度比较a、b两个数组 |
表11-9所列的各个方法并没有指出参数的类型,这是因为参数可以是多种数据类型。例如sort()方法既可以对int型数组完成升序排列,也可以对double型数组完成升序排列,介于篇幅原因,表11-9省略了各方法的参数的类型。此外,表中的copyOf()方法也没有指出返回值的类型,这是因为copyOf()方法的返回值类型与参数a的类型相同,参数a也可以是多种类型,因此没有指出该方法的返回值类型。
binarySearch()方法可以实现二分查找,二分查找要求数组中的元素必须是按照从小到大的顺序排列,因此如果数组中的元素没有按照要求进行排列,查找不会得出准确结果。binarySearch()方法如果在数组中找到了某个元素,就返回该元素在数组中的下标,如果找不到的话,就返回一个负数。
为帮助程序员快速完成数组元素的排序,Arrays类提供了sort()和parallelSort()两个用于排序的方法,这两个方法都能实现数组元素从小到大的排列。sort()和parallelSort()这两个方法虽然有同样的效果,但它们的算法各不相同,因此导致排序的速度也不同。实践表明:在数组长度小于10000的情况下sort()方法比较快,而长度达到10000以上时parallelSort()方法会更快一些。实际上,程序员还可以用这两个方法实现对部分数组元素完成排序,只需要指定排序范围的下标即可。下面的【例11_25】展示了Arrays类操作数组常用方法的执行效果。
【例11_25 操作数组的常用方法】
Exam11_25.java
import java.util.Arrays;
public class Exam11_25 {
public static void main(String[] args) {
int[] arrayA = {2,5,1,7,9};
int[] arrayB = {1,3,5,7,9};
System.out.print("用binarySearch()方法在arrayA找5的下标:");
System.out.println(Arrays.binarySearch(arrayA,5));
System.out.print("用binarySearch()方法在arrayB找5的下标:");
System.out.println(Arrays.binarySearch(arrayB,5));
System.out.println("arrayA被转换为字符串:"+Arrays.toString(arrayA));
Arrays.sort(arrayA);//对arrayA进行排序
System.out.println("排序后的arrayA:"+Arrays.toString(arrayA));
Arrays.fill(arrayA,1,3,0);//用数字0填充arrayA的[1,3)部分
System.out.println("用数字0填充arrayA的[1,3)部分:"+Arrays.toString(arrayA));
Arrays.fill(arrayA,0);//用数字0填充arrayA的全部
System.out.println("用数字0填充arrayA的全部:"+Arrays.toString(arrayA));
int[] arrayC = Arrays.copyOf(arrayB,3);//复制arrayB,复制版数组长度为3
System.out.println("复制arrayB,长度为3:"+Arrays.toString(arrayC));
int[] arrayD = Arrays.copyOf(arrayB,10);//复制arrayB,复制版数组长度为10
System.out.println("复制arrayB,长度为10:"+Arrays.toString(arrayD));
}
}
【例11_25】的运行结果如图11-24所示。
图11-24【例11_25】运行结果
从图11-24可以看出:用binarySearch()方法在arrayA中查找数组元素并没有成功,这是因为arrayA中的元素并不是有序的。使用fill()方法填充arrayA,可以只填充一部分,也可以全部都填充。而调用copyOf()方法复制数组时,如果复制版数组的长度小于原版数组,那么就只复制数组的前面那一部分元素,而如果复制版数组的长度大于原版数组,则复制原版数组的全部元素,并且用数组的默认值填充其余部分。
Arrays类除了能够操作数组以外,还可以对两个数组进行比较。下面的【例11_26】展示了比较两个数组的各种方法的运行效果。
【例11_26数组的比较】
Exam11_26.java
import java.util.Arrays;
public class Exam11_26 {
public static void main(String[] args) {
int[] arrayA = {1,3,5,7,9};
int[] arrayB = {1,3,5,7,9};
int[] arrayC = {1,3,8,7,9};
int[][] arrayD = {{1,2,3},{4,5,6}};
int[][] arrayE = {{1,2,3},{4,5,6}};
System.out.println("arrayA与arrayB比较:"+ Arrays.equals(arrayA,arrayB));
System.out.println("arrayA与arrayC比较:"+ Arrays.equals(arrayA,arrayC));
System.out.print("arrayA与arrayC第一对不相同元素的下标:");
System.out.println(Arrays.mismatch(arrayA, arrayC));
System.out.print("arrayA与arrayC第一对不相同元素大小关系:");
System.out.println(Arrays.compare(arrayA, arrayC));
System.out.print("使用equals()方法比较ArrayD与ArrayE:");
System.out.println(Arrays.equals(arrayD, arrayE));
System.out.print("使用deepEquals()方法比较ArrayD与ArrayE:");
System.out.println(Arrays.deepEquals(arrayD, arrayE));
}
}
【例11_26】的运行结果如图11-25所示。
图11-25【例11_26】运行结果
从图11-25可以看出:使用compare()方法计算arrayA与arrayC第一对不相同元素大小关系的结果为-1,这个-1表示在两个数组中出现的第一对不相同的元素中,arrayA中的元素较小。如果返回1则说明arrayA中的元素较大。此外还可以看出:使用equals()方法比较两个二维数组arrayD与arrayE,比较的结果为false,这是因为equals()方法在比较数组元素的过程中,如果数组元素是基础类型数据,则直接用==比较两个元素的值是否相同,而如果数组元素是引用类型数据,则调用对象的equals()方法进行比较。二维数组的元素是一维数组,一维数组也是对象,它的equals()方法只是比较两个对象是否为同一个对象,因此比较结果为false。而调用deepEquals()方法对二维数组进行比较时,则会深入数组的最底层比较每一对元素是否对应相同,因此比较结果为true。实际上,如果读者查看源代码,就会发现Arrays类的deepEquals()方法和Objects类的deepEquals()方法采用了相同的算法规则,因此使用Objects类的deepEquals()方法也能对多维数组进行准确的比较。