首页 > 编程语言 >第十一章《Java实战常用类》第8节:Arrays类

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

时间:2023-01-02 12:31:24浏览次数:68  
标签:11 Java Arrays 第十一章 System 数组 arrayA out

​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类_Java

图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类_数组_02

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

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


标签:11,Java,Arrays,第十一章,System,数组,arrayA,out
From: https://blog.51cto.com/mugexuetang/5983597

相关文章

  • java多线程
    1、线程:进程想要执行任务就需要依赖线程。换句话说,就是进程中的最小执行单位就是线程,并且一个进程中至少有一个线程。 线程不能独立存在,必须依赖进程,在进程中运行每一个进......
  • Java:SpringBoot整合Redis实现数据缓存
    目录结构$tree.├──pom.xml└──src├──main│├──java││└──com││└──example││......
  • 第十一章《Java实战常用类》第1节:包装类
    ​Java语言有8种基础数据类型,这些类型的数据都不是对象。有些情况下,必须用对象的形式来表示一个基础数据,例如Java语言要求存入集合的数据都必须是对象,不能是基础类型数据,因......
  • 第十一章《Java实战常用类》第2节:BigInteger类和BigDecimal类
    ​编写Java代码的过程中总是要和数字打交道。通常情况下,程序员使用Java语言所提供的int、long、float、double这些基础数据类型的变量就能存储数字。但有的时候程序中会使用......
  • 第十一章《Java实战常用类》第3节:Math类
    ​Math类位于java.lang包下,它提供了很多关于数学计算的方法,这些方法主要包括:计算三角函数的方法、计算指数和对数的方法、对数字进行舍入的方法、求随机数的方法等。这些用......
  • 第十一章《Java实战常用类》第4节:Random类
    ​在很多程序当中都要用到随机数。例如某个软件在登录时需要填写一个四位数的验证码,这个验证码就是一个典型的随机数。位于java.util包下的Random类是一个专门用于生成随机......
  • JavaScript-变量
    JavaScript变量目录JavaScript变量1.变量概述1.1什么是变量1.2变量在内存中的存储2.变量的使用3.变量语法扩展1.更新变量2.同时声明多个变量3.声明变量特殊情况4.......
  • 第十一章《Java实战常用类》第5节:UUID类
    ​有时候程序员需要用一个的字符串来给数据当作唯一标识。例如,很多大型电商系统每分钟就有可能产生上万条交易数据,如果每条数据都需要和其他数据区分开,程序员就要给每条数据......
  • java通过webdav实现文件上传
    importio.swagger.annotations.*;importorg.apache.http.HttpEntity;importorg.apache.http.auth.AuthScope;importorg.apache.http.auth.Credentials;importorg......
  • java接口了解
    packagecom.zls.demo1_接口的定义;publicinterfaceIA{//常量默认修饰符是publicstaticfinal这3个修饰符可以省略不写publicstaticfinalint......