Java开发笔记(二十三)数组工具Arrays

数组作为一种组合形式的数据类型,必然要求提供一些处理数组的简便办法,包括数组比较、数组复制、数组排序等等。为此Java专门设计了Arrays工具,该工具包含了几个常用方法,方便程序员对数组进行加工操作。Arrays工具的方法说明如下:

		Arrays.equals(a1, a2); // 判断a1和a2两个数组是否相等,也就是每个元素是否都相等Arrays.fill(a, val); // 往数组a全部填入指定的数值valdest = Arrays.copyOf(src, newLength); // 把数组src的内容赋值给数组dest,且dest的长度为newLengthArrays.sort(a); // 对数组a的内部元素进行排序,结果是按照升序排序

 

下面分别对以上的四个数组处理方法进行介绍:


1、Arrays.equals方法
前面说过,双等号“==”可用来判断两个变量的数值是否相等,但“==”只适合基本变量类型之间的比较,例如比较两个整型变量是否相等、两个双精度数是否相等、两个布尔变量是否相等。如果两个数组变量通过“==”进行相等判断,则比较的是这两个数组是否为同一个数组,而不是比较两个数组的所有元素是否都相等。要想判断两个数组内部的每个元素是否一一相等,就必须通过Arrays工具的equals方法来辨别。equals方法返回true表示两个数组的所有元素都相等,返回false表示两个数组至少有一个元素不相等。

2、Arrays.fill方法
在声明数组变量的时候,经常需要对它进行初始化赋值,比如书店进了十本书,每本书的售价都是99元,那么按照常规写法只能书写十遍99,就像下面代码这样:

		// 构造一个包含十个99的数组变量int[] prices = {99, 99, 99, 99, 99, 99, 99, 99, 99, 99};

 

显然输入重复的数字是个负担,尤其重复数量很多的时候更甚。现在利用Arrays的fill方法,只需一行代码即可对该数组的所有元素都填上相同的数值,于是数组的初始赋值代码便优化为下面这样:

		// 声明一个整型数组,数组大小为10int[] prices = new int[10];// 给整型数组的每个元素全部填写99Arrays.fill(prices, 99);// 打印整型数组的所有元素数值for (int price : prices) {System.out.println("price = "+price);}

  

3、Arrays.copyOf方法
把一个数组变量赋值给另一个数组变量,似乎可以用等号直接赋值,这种情况在一般情况下没有问题。但若是赋值之后修改了原数组的某个元素,那就出现问题了。譬如以下的演示代码,先把数组变量pricesOrigin赋值给pricesAssign,接着修改原数组pricesOrigin的元素值,再去打印新数组pricesAssign的所有元素:

		// 声明一个整型数组,数组大小为5,并且5个元素全为99int[] pricesOrigin = {99, 99, 99, 99, 99};// 复制数组的第一个办法:利用等号直接赋值int[] pricesAssign = pricesOrigin;pricesOrigin[1] = 80;for (int price : pricesAssign) {System.out.println("assign price = "+price);}

 

运行以上的演示代码,完整的日志输出如下所示:

assign price = 99
assign price = 80
assign price = 99
assign price = 99
assign price = 99

 

没想到打印出来的第二个数组元素竟然变了,可是演示代码明明只改了原数组pricesOrigin,并未修改新数组pricesAssign呀。让测试程序出现神经错乱的缘故,乃是数组之间的等号赋值相当于给数组起个别名,并非从头到尾完整复制一个新数组出来。既然只是起了个别的名称,那么实际上还是原名称所指的数组,无非是该数组有两个姓名罢了。
显然这个情况不是程序员期望的结果,程序员的本意是复制另外的数组,新数组不再与原数组有任何关联,大家井水不犯河水,互不干涉、互不影响。最好克隆一个一模一样的新数组出来,Java恰巧给每个数组变量都提供了clone方法,该方法正是拿来克隆数组用的。克隆出来的新数组有分配单独的存储空间,并且数组元素的数值与原数组完全一致,如此便实现了正常意义上的数组赋值功能。利用clone方法复制数组变量的示例代码如下:

		// 复制数组的第二个办法:调用原数组的clone方法int[] pricesClone = pricesOrigin.clone();pricesOrigin[1] = 80;for (int price : pricesClone) {System.out.println("clone price = "+price);}

 

运行如上的示例代码,得到下面的日志输出结果:

clone price = 99
clone price = 99
clone price = 99
clone price = 99
clone price = 99

 

可见此时修改了原数组的元素数值,并没有改变新数组的元素值,真正做到了完整的复制操作。
不过clone方法人如其名,它把原数组的所有元素一个不漏全部复制到新数组,这意味着,如果只想复制部分元素给新数组,那末clone方法就无能为力了。为此,Java给Arrays工具增配了一个copyOf方法,该方法允许从来源数组复制若干元素给目标数组。当待复制的元素个数恰好等于原数组的大小时,copyOf方法的作用等同于数组变量的clone方法。下面是通过copyOf方法将数组原样复制到新数组的代码例子:

		// 复制数组的第三个办法:调用Arrays工具的copyOf方法int[] pricesCopy = Arrays.copyOf(pricesOrigin, pricesOrigin.length);pricesOrigin[1] = 80;for (int price : pricesCopy) {System.out.println("copy price = "+price);}

 

从上面代码看到,copyOf方法身后跟着两个参数,第一个参数是原数组的名称,第二个参数是要复制的元素个数。接下来把第二个参数改小一点,看看copyOf方法是否真的支持只复制部分元素?于是第二个参数改为“pricesOrigin.length-1”之后的代码如下所示:

		// 改变copyOf方法的第二个参数值,允许复制指定大小的数组元素int[] pricesPart = Arrays.copyOf(pricesOrigin, pricesOrigin.length-1);for (int price : pricesPart) {System.out.println("part price = "+price);}

 

重新运行修改后的数组复制代码,日志输出结果见下:

part price = 99
part price = 99
part price = 99
part price = 99

 

这下看到新数组的元素只有四个,而原数组共有五个元素,说明此时的确只复制了部分元素。
Arrays工具的copyOf方法还有个妙用,比如有个数组分配了初始大小为5,现在想把该数组的长度扩大到10,这时利用copyOf方法就能动态调整数组的大小。具体做法是:调用copyOf方法之时,来源数组和目标数组都填该数组的名称,然后待复制的元素大小填写扩大后的长度。下面的代码便演示了如何将某数组的大小拉长一位:

		// 把copyOf方法的返回值赋给原数组,可以动态调整该数组的大小pricesOrigin = Arrays.copyOf(pricesOrigin, pricesOrigin.length+1);for (int price : pricesOrigin) {System.out.println("origin price = "+price);}

 

运行调整数组大小的演示代码,观察到以下的日志输出:

origin price = 99
origin price = 99
origin price = 99
origin price = 99
origin price = 99
origin price = 0

 

由此可见,数组大小果然增大了一位,并且新增的数组元素值为0,这正是整型变量的默认数值。

4、Arrays.sort方法
顾名思义,Arrays工具的sort方法是给数组元素排序的,并且排序结果为升序。sort方法用起来很简单,只要把待排序的数组名称填进圆括号,编译器就会自动完成该数组的排序任务。举个给整型数组排序的例子,简单的Java实现代码如下:

		int[] pricesOrigin = {99, 80, 18, 68, 8};// 对整型数组pricesOrigin里的元素进行排序操作,sort方法得到的结果是升序排列Arrays.sort(pricesOrigin);for (int price : pricesOrigin) {System.out.println("origin price = "+price);}

 

运行上述的排序代码,得到下面的结果日志:

origin price = 8
origin price = 18
origin price = 68
origin price = 80
origin price = 99

 

从日志看到,排序后的数组元素从小到大打印,很明显这是升序排列。
当然,在前面的例子中,数组元素早在声明数组时便初始化赋值了,实战性不强。接下来尝试动态生成一个随机数数组,再对该数组进行排序,这样更贴近实际业务。详细的实现代码可能涉及到数组、循环、冒号跳转等技术,有兴趣的朋友不妨动手实践。下面是随机数组生成并排序的代码例子:

		int[] numbers = new int[20];loop : for (int i=0; i<numbers.length; i++) {// 生成一个小于100的随机整数int item = (int) Math.round(Math.random()*1000%100);// 下面的循环用来检查数组中是否已经存在该随机数for (int j=0; j<i; j++) {if (numbers[j] == item) {i--;// 已经存在该随机数,则继续第一层循环,重新生成随机数continue loop;}}// 原数组不存在该随机数,则把随机数加入到数组中numbers[i] = item;}// 对整型数组numbers里的元素进行排序操作,sort方法得到的结果是升序排列Arrays.sort(numbers);for (int number : numbers) {System.out.println("number = "+number);}

 

更多Java技术文章参见《Java开发笔记(序)章节目录》

转载于:https://www.cnblogs.com/pinlantu/p/9955362.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生成对抗网络gan原理_必读!TOP10生成对抗网络GAN论文(附链接)

来源&#xff1a;新智元本文约2200字&#xff0c;建议阅读7分钟。本文所选论文提供了一个易读的对GAN的介绍&#xff0c;帮助你理解GAN技术的基础。[ 导读 ]生成对抗网络 (GAN) 是深度学习中最有趣、最受欢迎的应用之一。本文列出了 10 篇关于 GAN 的论文&#xff0c;这些论文将…

visudo精确用户赋权(sudo)

原文BLOG&#xff1a;http://iminmin.blog.51cto.com/689308/455992sudo” 是 Unix/Linux 平台上的一个非常有用的工具&#xff0c;允许为非根用户赋予一些合理的 “ 权利 ” &#xff0c;让他们执行一些只有根用户或特许用户才能完成的任务&#xff0c;从而减少根用户的登陆次…

es6中的类及es5类的实现

目录 类的特点类的特点 1.类只能通过new得到 在es6中类的使用只能是通过new&#xff0c;如果你将它作为一个函数执行&#xff0c;将会报错。 //es6的写法 class Child {constructor() {this.name 1;} } let child new Child(); console.log(child.name)//1 //如果直接…

python高阶函数filter_Python进阶系列连载(13)——Python内置高阶函数filter(上)...

前言进阶部分连载继续~如果还没看过我的入门连载部分&#xff0c;先看&#xff1a;当然&#xff0c;小编的免费入门课程已经有咯&#xff0c;看过连载的朋友可以看看视频再快速梳理一遍~前文传送门&#xff1a;filterfilter是什么意思呢&#xff1f;我们百度看看&#xff1a;百…

javaone_JavaOne 2012:观察与印象

javaone我正坐在旧金山国际机场等待登上一架飞机&#xff0c;然后又一次满意但累人的JavaOne&#xff08;2012&#xff09;体验&#xff0c;开始撰写这篇特别的博客文章。 自上周日的主题演讲以来&#xff0c;在会议上狂热地撰写了约30篇博客文章之后&#xff0c;再写另一篇博客…

CSDN转载博客的方法

前言 对于喜欢逛CSDN的人来说&#xff0c;看别人的博客确实能够对自己有不小的提高&#xff0c;有时候看到特别好的博客想转载下载&#xff0c;但是不能一个字一个字的敲了&#xff0c;这时候我们就想快速转载别人的博客&#xff0c;把别人的博客移到自己的空间里面&#xff0c…

linux 服务器账号及安全杂谈

1、useradd zhangsan&#xff0c;添加zhangsan用户后&#xff0c;不能交互式登陆该账号。 原因是&#xff1a;/etc/shadow中内容是 zhangsan:!!:16804:0:99998:7::: 其中&#xff0c;两个!!表示出于安全角度&#xff0c;不能登陆。给zhangsan设置密码后&#xff0c;就可以登陆…

mysql-9索引

mysql索引的建立对于mysql的高效运行是很重要的&#xff0c;索引可以大大提高mysql的检索速度。 索引分为单列索引和组合索引。 单列索引&#xff0c;即一个索引只包含单个列&#xff0c;一个表可以有多个单列索引&#xff0c;但这不是组合索引。 组合索引&#xff0c;即一个索…

带有AWS Lambda和Java的无服务器FaaS

什么是无服务器架构&#xff1f; 无服务器架构在由第三方完全管理的临时容器中运行自定义代码。 自定义代码通常只是完整应用程序的一小部分。 也称为函数 。 这为无服务器架构提供了另一个名称&#xff0c;即功能即服务 &#xff08;FaaS&#xff09;。 该容器是短暂的&#x…

python 查找算法_七大查找算法(Python)

查找算法 -- 简介查找(Searching)就是根据给定的某个值&#xff0c;在查找表中确定一个其关键字等于给定值的数据元素。查找表(Search Table)&#xff1a;由同一类型的数据元素构成的集合关键字(Key)&#xff1a;数据元素中某个数据项的值&#xff0c;又称为键值主键(Primary K…

traceroute命令的用法实例

ceroute命令的用法实例traceroute 跟踪数据包到达网络主机所经过的路由工具&#xff1b;traceroute 是用来发出数据包的主机到目标主机之间所经过的网关的工具。traceroute 的原理是试图以最小的TTL发出探测包来跟踪数据包到达目标主机所经过的网关&#xff0c;然后监听一个来自…

去除div最后一个逗号_去除重复值、统计数量,这个公式可以直接套用!

点击上方蓝字关注星标★不迷路本文作者&#xff1a;拉登 Dony来源&#xff1a;拉小登(ID&#xff1a;ladengchupin)本文编辑&#xff1a;小叮、竺兰前段时间遇到这样一个问题&#xff0c;让我很头疼。头疼的原因有 3 点&#xff1a;❶ 问题描述不清晰&#xff0c;理解起来困难&…

spring shell_Spring Shell项目发布

spring shellSpring Source昨天发布了Spring Shell 。 Spring Shell是一个交互式Shell&#xff0c;可以使用基于Spring的编程模型轻松地通过命令进行扩展。 它是通过删除OSGi依赖项从Spring Roo项目中提取的&#xff0c;并变成了一个独立项目。 这使得那些只希望使用交互式外壳…

Word报告自动生成(例如 导出数据库结构)

将很早之前写的一个小组件重新整理优化一下&#xff0c;做成一个通用的功能。适用于导出数据库的结构&#xff08;表、字段等&#xff09;到Word或将体检数据自动生成Word版的体检报告等。代码&#xff1a;Github 一、主要需要完成功能: 1. 灵活的配置规则及word样式设置&#…

马尔科夫随机场

1、相关概念 马尔科夫随机过程&#xff1a;在已知当前状态的情况下&#xff0c;未来的状态只与当前状态有关&#xff0c;与过去状态无关。这种已知“现在”的条件下&#xff0c;“未来”和“过去”彼此独立的特性叫做马尔科夫性&#xff0c;具有这种特性的随机过程叫做马尔科夫…

php上传文件详解

上传文件功能由两个部分组成&#xff0c;HTML页面和PHP处理部分。HTML页面主要是让用户选择所要上传的文件&#xff0c;php部分让我们可以把文件存储到服务器的指定目录。 一&#xff0e;HTML部分 upload.html [html] view plaincopy<html> <head> &…

pythonwhile循环love_input和while循环——Python编程从入门到实践

PythonPython开发Python语言input和while循环——Python编程从入门到实践input( )input()函数&#xff1a;让程序运行暂停&#xff0c;等待用户输入。message input(Tell me something, and I will repeat it back to you:)print(message)运行结果&#xff1a;Tell me somethi…

phpstudy添加redis扩展

操作系统 windows&#xff1b; 直接贴步骤记录下 一. 划重点&#xff0c;运行phpinfo(), 观察第四行 x86 好了记住这个 x86 三. http://pecl.php.net/package/redis php官方redis扩展下载地址&#xff1b; 我需要的是3.1的版本 之前记住的 x86 当然并不是所有人…

高阶图匹配

一、基于结构特征的相似性度量 将特征看作向量空间中的点&#xff0c;通过计算两个点或者两个点组之间的距离来度量他们是否相似。 一阶度量&#xff1a;minkowsky距离、马氏距离 二阶度量&#xff1a;特征点本身有相关性&#xff0c;所以将特征点对之间的关系加入到相似性度量…

visual studio installer可以卸载吗_ArcGIS 怎样彻底删除和卸载

如何完全卸载ArcGIS为大家演示如何完全卸载ArcGIS。方法/步骤1打开控制面板&#xff0c;找到“卸载程序”。或者使用360安全卫士2选择卸载程序&#xff0c;在新界面中找到与ArcGIS有关的程序。3右键单击要卸载的内容&#xff0c;并选择“卸载/更改”。按照此方法&#xff0c;把…