专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java技术编程分享,arrays的用法

Java技术编程分享,arrays的用法

更新时间:2020-06-02 16:32:51 来源:动力节点 浏览1718次

Arrays

位于java.util包内的Arrays类是Java提供的一个操作数组的工具类,其内部定义了一些常见的用于操作数组的静态方法,下面就按照以下几个常用类型,梳理一下。

数组转List

排序

查找

元素填充

Arrays数组操作集

数组转List---asList

Java技术编程分享,arrays的用法

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

Java技术编程分享,arrays的用法

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

Java技术编程分享,arrays的用法

其实,个人感觉“数组转List”这种说法是没有意义的;我们都知道在List是一个接口,而真正实现了这个接口的类只有ArrayList,LinkedList,Vector。其中ArrayList和Vector内部都是使用“动态数组”实现,LinkedList采用链表结构实现。数据的物理结构只用顺序存储接口和链式存储结构,List也不出其右。因此说这个方法实现了数组拷贝更确切一点。

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

Java技术编程分享,arrays的用法

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

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

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

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

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

Java技术编程分享,arrays的用法

可以看到,正常情况下,ArrayList的构造函数完成的工作就是一个赋值操作,把我们传递进来的数组赋给a,而a就是一个数组。说白了,这就是一个数组拷贝的过程。再看ArrayList内部实现,get,set都是根据数组下标实现简单的数组赋值操作。这里省略了ArrayList内部几个方法,总之都是对数组的操作,有兴趣的同学,可以自行查看源码。注意,这个类内部,并没有add方法的具体实现,也就是说AbstractList内部的add方法并没有被覆盖

AbstractList#add

Java技术编程分享,arrays的用法

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

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

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

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

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

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

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

Java技术编程分享,arrays的用法

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

Java技术编程分享,arrays的用法

排序

sort

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

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

基本数据类型的排序

Java技术编程分享,arrays的用法

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

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

Object类型数组排序

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

Java技术编程分享,arrays的用法

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

实现Comparator接口的排序

Java技术编程分享,arrays的用法

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

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

parallelSort

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

Java技术编程分享,arrays的用法

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

查找

Arrays内部的查找,主要是binarySearch(二分查找法)。可以说,关于查找到实现分类和排序完全一样。首先从数据类型上也是分为基础数据类型构成的数组和对象数组。都支持按特定范围进行排序;对于对象数组的排序,对象数组需要实现Comparable接口或者是提供Comparator接口的实例。

Java技术编程分享,arrays的用法

元素填充

Java技术编程分享,arrays的用法

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

以上就是动力节点java培训机构的小编针对“Java技术编程分享,arrays的用法”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>