第十一章《Java实战常用类》第8节:Arrays类

时间:2023-01-02 12:58:19

​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所示。​

第十一章《Java实战常用类》第8节:Arrays类

图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所示。​

第十一章《Java实战常用类》第8节:Arrays类

图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()方法也能对多维数组进行准确的比较。

本文字版教程还配有更详细的视频讲解,小伙伴们可以点击这里观看。