第十一章《Java实战常用类》第8节:Arrays类
  TEZNKK3IfmPf 2023年11月15日 18 0

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

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月15日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   24天前   51   0   0 java
  TEZNKK3IfmPf   2024年05月31日   55   0   0 java
TEZNKK3IfmPf