当前位置: 首页 > news >正文

java arrays方法_Java工具类Arrays中不得不知的常用方法

原标题:Java工具类Arrays中不得不知的常用方法

Arrays 数组操作集数组转List ---asList

这个被“普遍”称为数组转List的方法,可能是Arrays内大家使用频率最高的一个静态方法了。使用起来也很简单,下面就很容易的实现了将数组转为List。

当然还有另一种使用方法:

其实,个人感觉“数组转List”这种说法是没有意义的;我们都知道在List是一个接口,而真正实现了这个接口的类只有ArrayList,LinkedList,Vector。

其中ArrayList和Vector内部都是使用“动态数组”实现,LinkedList采用链表结构实现。

数据的物理结构只用顺序存储接口和链式存储结构,List也不出其右。因此说这个方法实现了数组拷贝更确切一点。

下面,根据他的具体实现,我们更能体会到拷贝的意义。

73627e3d28f0fdb58d9b30e78c12232d.png

1bc4637cc9348504dbd9ca32a8130940.png

这里需要注意的是,asList内部的ArrayList并不是我们常用的那个ArrayList,而是在Arrays类内部的一个私有静态类。从代码可以看出,这个内部的ArrayList,和常规的ArrayList相比,并没有实现List接口,而是直接继承了AbstractList。

以下所说的ArrayList 统一指此处的静态类

asList的实现很简单,返回了一个ArrayList的实例,参数为所要拷贝的数组名。

可以看到asList() 是接受一个泛型的变长参数的,而基本数据类型是无法被泛型化的。而对于泛型而言,基本数据类型,实际上会被人为是一个 [x 的类型。 [ 表示这是一个数组,x 为当前数组的类型。

因此,这个方法不能直接“转换”基础数据类型的数组。

253dc8edbe08a6c2f404706d4ea86018.png

可以看到,正常情况下,ArrayList的构造函数完成的工作就是一个赋值操作,把我们传递进来的数组赋给a,而a就是一个数组。

说白了,这就是一个数组拷贝的过程。再看ArrayList内部实现,get,set 都是根据数组下标实现简单的数组赋值操作。

这里省略了ArrayList内部几个方法,总之都是对数组的操作,有兴趣的同学,可以自行查看源码。注意,这个类内部,并没有add方法的具体实现,也就是说AbstractList内部的add方法并没有被覆盖

因此,通过asList返回的List,一定不能进行add 操作,否则会抛出异常。

通过以上分析,我们可以得出以下结论:

asList 不接受基本数据类型的数组名,作为参数直接传递。

asList 通过backed(拷贝)的方式,返回的是一个固定长度的List,这点从方法注释也可以看到

鉴于第二条,不能对这个返回的List执行add 方法,可以调用set方法。

同理不能调用remove方法,但可以调用get方法获取元素。

这里关于第一个结论,还需要解释一下,不接受基本数据类型的数组名作为参数,但是以下实现是可以的。

好了,Arrays.asList的用法就说到这里了。既然都到这里了,顺便多说一句,List转数组的实现,Collection接口定义了统一的方法toArray。对于不同的List实现,统一调用即可。

排序sort

sort() 方法顾名思义,主要是实现数组的排序,默认按升序进行排列。

Arrays 内部关于sort的实现,可以大体分为两类,一类是基本数据类型的排序,一类是Object类型的排序。

基本数据类型的排序

4cfcc2d832f2e19f6d9dd08de88599bf.png

sort静态方法的实现,按参数主要有两种实现方法,一种是数组整体进行排序;一种是在数组内指定一段起始位置进行排序,之后的对象数组排序也只是按指定起始位置排序,不再重复描述。其内部具体实现是DualPivotQuicksort(双轴快速排序)。

这里可以接收的参数类型除了int数组,还可以是long,short,char,byte,float,double类型数组。

Object 类型数组排序

实现Comparable接口的对象数组排序

f60ae20bc741a378062f83f1b6242cea.png

注意,使用这个方法时,提供的“数组中的对象”必须是实现了Comparable接口的,也就是说必须告知明确告知,对数组中的对象是按什么规则排序。

实现Comparator接口的排序

76e0a049e6755c334b0f0d141024206c.png

使用这个方法是泛型为T的数组,需要提供一个实现了Comparator接口的实例,同理也是必须明确告知排序规则,如果同时实现了Comparable接口和Comparator接口,Comparator接口的实现将覆盖Comparable接口的排序规则。

对象数组排序内部实现采用了LegacyMergeSort(归并排序)和TimSort排序。

parallelSort

parallelSort 是Java8新增的排序方式,和sort方法不同的是,他采用多线程并行的方式进行排序,当数据规模较大时和sort相比有明显优势;

83e103489f175c791cfa977def54b612.png

parallelSort 使用方式及可接受参数类型和sort方法基础数据类型时的参数完全一致。

查找

Arrays内部的查找,主要是binarySearch(二分查找法)。可以说,关于查找到实现分类和排序完全一样。

首先从数据类型上也是分为基础数据类型构成的数组和对象数组。都支持按特定范围进行排序;对于对象数组的排序,对象数组需要实现Comparable接口或者是提供Comparator接口的实例。

5059f6598c8189522cd15c7a9e750e76.png

元素填充

06f6255466e2013aaca4838784c192ad.png

fill()方法,使用很简单,也很好理解,将数组用特定的元素val 填满即可,也可以是特定位置。

复制

这个方法,就是实现两个将原数组按指定长度复制到目标数组内返回。

56d94bc9f69e7c37ec1809ca85e1b8e2.png

其内部使用System.arraycopy方法,这是一个Java提供的native方法,因此效率会高一些。Java 内部关于数组复制的实现,都用到了这个方法。

同样,也包括一个copyOfRange的方法,这个按名字就可以理解,就是按照范围进行复制。

toString

这个toString的静态方法,其实也很实用;从下面的代码的实现,可以看出,他的作用就是将我们定义的数组,按照 "[a0,a1,....]"的格式转成字符串,方便我们直接打印整个数组,打印出来的日志也会看起来更直观,更方便。

c86c32199799711bd0d4418f50fb15ad.png

它除了支持8种基础数据类型的数组外,还支持Object类型的数组。

相等性equals

Arrays内部关于两个数组相等的判断可以首先看下下面的代码:

基础数据类型数组,以long类型为例

de4101c00ae651b038d7a87a33cdab44.png

Object 类型数组

42b40e9873bc38b957945f2cc98ae53e.png

我们知道,数组名代表数组首地址;因此,从以上代码可以得出结论,

当两个数组不是同一数组时,也就是a==a2 不成立。

当满足以下任一条件时:

两个数组中有一个为空时

两个数组长度不等时

两个数组中包含任意不相等的元素时

就认为两个数组不相等,反之则认为相等。对于对象数组,相同位置的对象均为null是,认为是两个相同的元素。

deepEquals其他数组交换

0dc31056a1c792dbfe2b58bd08d4eaa6.png

这个方法其实挺实用的,以后如果懒得写了,可以直接一行代码搞定。

最后

以上分析是基于Java jdk1.8 版本,在Java中由于lamdba表达式,函数式编程思想的引入,Arrays内部新增了许多相关的类如Stream 等,考虑到使用频率,暂时不展开讨论了。返回搜狐,查看更多

责任编辑:


http://www.taodudu.cc/news/show-647763.html

相关文章:

  • 【physx/wasm】在physx中添加自定义接口并重新编译wasm
  • excel---常用操作
  • Lora训练Windows[笔记]
  • linux基础指令讲解(ls、pwd、cd、touch、mkdir)
  • InnoDB 事务处理机制
  • 启明云端ESP32 C3 模组WT32C3通过 MQTT 连接 AWS
  • java for 死循环_简单的java死循环 java中的死循环问题
  • java toolkit invoker_有没有哪位老哥愿意帮一下新人啊
  • java 枚举 下拉框_枚举enum在velocity模板语言中的应用-下拉菜单
  • mywebsql java版_MyWebSQL|MySQL数据库管理软件(MyWebSQL)下载v3.7官方版 - 欧普软件下载...
  • java打包后发布找不到jsp_eclipse中web项目部署以后jsp的java文件找不到问题(Tomcat配置serverlocations)...
  • java 队列的数组_JAVA-循环数组实现简单的队列
  • java 字节取位_java位 、字节 、字符的梳理
  • jemalloc java_从源构建tensorflow遇到错误:规则'@jemalloc//:jemalloc'的C编译失败
  • laravel 调试mysql_Laravel - MySQL数据库的使用详解3(Query Builder用法2:新增、修改、删除)...
  • php mysql.x86 64_centos7.2yum安装php70w.x86_64
  • java jbutton 禁用_java – 如何禁用JButton在禁用时变灰?
  • java论文翻译_Java技术(外文文献翻译)
  • java后台接收数据格式_Java后台基于POST获取JSON格式数据
  • aes c# java_AES加密,C#和java相同
  • java原生封装_[Java教程]原生AJAX封装
  • java max sum_杭电1024 Max Sum Plus Plus状压dp(java)
  • java主线程控制子线程_CountDownLatch控制主线程等子线程执行完--Java多线程
  • mysql数据库事件不执行_如何查看mysql事件是否执行
  • 我的世界1.7.10java下载安装_我的世界1.7.10正式版
  • java编写单词数_JAVA flink小试——单词计数
  • bbs mysql_简单BBS程序(需MySQL支持)
  • java oom分析_OOM分析
  • anaconda怎么使用python包_Anaconda中python包的介绍与使用方法
  • php抓取运动步数,使用PHP抓取微博数据
  • php 网页截屏,怎么用PHP实现网页截图
  • thread php,php中关于线程thread的使用
  • cmf php,cmf公共函数解析-common.php
  • php 实现时时更新地图,PHP实现隔15分钟自动更新网站地图功能
  • php中显示不出图像,php – 无法显示图像,因为它包含错误
  • java后台日期怎么去重,JAVA后台业务实现去重