数组作为一种组合形式的数据类型,必然要求提供一些处理数组的简便办法,包括数组比较、数组复制、数组排序等等。为此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

Java开发笔记(二十三)数组工具Arrays相关推荐

  1. 【Visual C++】游戏开发笔记二十三 游戏基础物理建模 五 粒子系统模拟 二

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  2. 【Visual C++】游戏开发笔记二十三 游戏基础物理建模(五) 粒子系统模拟(二)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7607916 作者:毛星云    邮箱: h ...

  3. Java学习笔记(二十三)日志体系(logback)

    Java日志体系(logback) logback 简介 师出同门,与log4j一样,logback也是由Ceki Gülcü开发的开源日志组件,可以说是log4j的改进版:在现如今的项目中,logb ...

  4. (硅谷课堂项目)Java开发笔记4:前端基础知识(二)

    文章目录 (硅谷课堂项目)Java开发笔记4:前端基础知识(二) 一.NPM 1.NPM简介 1.1.什么是NPM 1.2.NPM工具的安装位置 2.使用npm管理项目 2.1.创建文件夹npm 2. ...

  5. 【Visual C++】游戏开发笔记三十三 浅墨DirectX提高班之二 化腐朽为神奇:DirectX初始化四步曲

    这篇文章里,我们将迈出精通DirectX的第一步,先了解典型Direct3D程序的书写流程,然后学习COM接口的对象的一些思想,然后按照"四步曲"的思路,系统地学习DirectX的 ...

  6. Java开发笔记(一百一十三)HttpClient实现下载与上传

    前面介绍了通过HttpClient实现HTTP接口的GET方式调用和POST方式调用,那么文件下载与文件上传又该如何操作呢?其实在HttpClient看来,文件下载属于特殊的GET调用,只不过应答报文 ...

  7. 【Visual C++】游戏开发笔记三十三 浅墨DirectX提高班之二 化腐朽为神奇:DirectX初始化四步曲...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/zhmxy555/article/details/8197792 作者:毛星云(浅墨) ...

  8. 【Visual C++】游戏开发笔记三十三 浅墨DirectX提高班之二 化腐朽为神奇 DirectX初始化四步曲

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:  http://blog.csdn.net/zhmxy555/article/details/8197792 作者:毛星云(浅 ...

  9. Java开发笔记(三十三)字符包装类型

    正如整型int有对应的包装整型Integer那样,字符型char也有对应的包装字符型Character.初始化字符包装变量也有三种方式,分别是:直接用等号赋值.调用包装类型的valueOf方法.使用关 ...

最新文章

  1. 用 namspace 隔离 DHCP 服务 - 每天5分钟玩转 OpenStack(90)
  2. 开关变压器绕制教程_教程:如何将变压器权重和令牌化器从AllenNLP上传到HuggingFace
  3. ThinkPHP_5对数据库的CURL操作
  4. 【Clickhouse】Clickhouse 整合 Prometheus 监控 运行时状态
  5. java swf 上传文件_[Pulgin] 利用swfupload实现java文件批量上传
  6. python多元回归 导出参数统计结果_如何从统计模型中WLS回归的二维参数得到检验的预测...
  7. luhn算法java_Java信用卡验证– Java中的Luhn算法
  8. Struts2返回JSON数据的具体应用范例
  9. 路由器连接猫服务器未响应,路由器连接猫不能上网怎么办
  10. Flash按钮操作(画面暂停与播放)
  11. “身体质量指数BMI”实例详解
  12. 洛谷B2006 地球人口承载力估计
  13. 人生观,世界观,价值观树立的方式
  14. 阿里云2017年度贡献者荣誉榜出炉
  15. 如何成为更好的软件架构师?
  16. 深入理解23种设计模式(14) -- 访问者模式
  17. P1307 [NOIP2011 普及组] 数字反转
  18. Appium使用swipe定位滚动列表和滚动屏幕元素
  19. 加密算法之SHA(SHA1、SHA256)
  20. plsqldev 记录

热门文章

  1. 电脑运行adb闪退_adb+python进阶使用
  2. python如何读取文件内容求和_使用python对文件中的数值进行累加的实例
  3. 计算机二级access模考软件_计算机二级考前通关大礼包来啦!各科目模考软件、视频教程,更有往年真题、最新考纲等打包送!...
  4. predicate 列存储索引扫描_ColumnStore index (列存储索引)解析
  5. pytorch dataset_【小白学PyTorch】16.TF2读取图片的方法
  6. python socket多线程 获取朋友列表_python socket多线程通讯实例分析(聊天室)
  7. 2017菜鸡C与C++工程师总结,撸码撸码,垃圾专科生撸码人生
  8. android module中获取 app_Android组件化架构 - 4. 动态创建
  9. aix磁盘挂载到linux,AIX下文件系统挂载点相互调换方案
  10. axture动画原型制作_Axure制作原型-基础操作