java arrays方法-尊龙游戏旗舰厅官网
原标题:java工具类arrays中不得不知的常用方法
arrays 数组操作集数组转list ---aslist
这个被“普遍”称为数组转list的方法,可能是arrays内大家使用频率最高的一个静态方法了。使用起来也很简单,下面就很容易的实现了将数组转为list。
当然还有另一种使用方法:
其实,个人感觉“数组转list”这种说法是没有意义的;我们都知道在list是一个接口,而真正实现了这个接口的类只有arraylist,linkedlist,vector。
其中arraylist和vector内部都是使用“动态数组”实现,linkedlist采用链表结构实现。
数据的物理结构只用顺序存储接口和链式存储结构,list也不出其右。因此说这个方法实现了数组拷贝更确切一点。
下面,根据他的具体实现,我们更能体会到拷贝的意义。
这里需要注意的是,aslist内部的arraylist并不是我们常用的那个arraylist,而是在arrays类内部的一个私有静态类。从代码可以看出,这个内部的arraylist,和常规的arraylist相比,并没有实现list接口,而是直接继承了abstractlist。
以下所说的arraylist 统一指此处的静态类
aslist的实现很简单,返回了一个arraylist的实例,参数为所要拷贝的数组名。
可以看到aslist() 是接受一个泛型的变长参数的,而基本数据类型是无法被泛型化的。而对于泛型而言,基本数据类型,实际上会被人为是一个 [x 的类型。 [ 表示这是一个数组,x 为当前数组的类型。
因此,这个方法不能直接“转换”基础数据类型的数组。
可以看到,正常情况下,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类型的排序。
基本数据类型的排序
sort静态方法的实现,按参数主要有两种实现方法,一种是数组整体进行排序;一种是在数组内指定一段起始位置进行排序,之后的对象数组排序也只是按指定起始位置排序,不再重复描述。其内部具体实现是dualpivotquicksort(双轴快速排序)。
这里可以接收的参数类型除了int数组,还可以是long,short,char,byte,float,double类型数组。
object 类型数组排序
实现comparable接口的对象数组排序
注意,使用这个方法时,提供的“数组中的对象”必须是实现了comparable接口的,也就是说必须告知明确告知,对数组中的对象是按什么规则排序。
实现comparator接口的排序
使用这个方法是泛型为t的数组,需要提供一个实现了comparator接口的实例,同理也是必须明确告知排序规则,如果同时实现了comparable接口和comparator接口,comparator接口的实现将覆盖comparable接口的排序规则。
对象数组排序内部实现采用了legacymergesort(归并排序)和timsort排序。
parallelsort
parallelsort 是java8新增的排序方式,和sort方法不同的是,他采用多线程并行的方式进行排序,当数据规模较大时和sort相比有明显优势;
parallelsort 使用方式及可接受参数类型和sort方法基础数据类型时的参数完全一致。
查找
arrays内部的查找,主要是binarysearch(二分查找法)。可以说,关于查找到实现分类和排序完全一样。
首先从数据类型上也是分为基础数据类型构成的数组和对象数组。都支持按特定范围进行排序;对于对象数组的排序,对象数组需要实现comparable接口或者是提供comparator接口的实例。
元素填充
fill()方法,使用很简单,也很好理解,将数组用特定的元素val 填满即可,也可以是特定位置。
复制
这个方法,就是实现两个将原数组按指定长度复制到目标数组内返回。
其内部使用system.arraycopy方法,这是一个java提供的native方法,因此效率会高一些。java 内部关于数组复制的实现,都用到了这个方法。
同样,也包括一个copyofrange的方法,这个按名字就可以理解,就是按照范围进行复制。
tostring
这个tostring的静态方法,其实也很实用;从下面的代码的实现,可以看出,他的作用就是将我们定义的数组,按照 "[a0,a1,....]"的格式转成字符串,方便我们直接打印整个数组,打印出来的日志也会看起来更直观,更方便。
它除了支持8种基础数据类型的数组外,还支持object类型的数组。
相等性equals
arrays内部关于两个数组相等的判断可以首先看下下面的代码:
基础数据类型数组,以long类型为例
object 类型数组
我们知道,数组名代表数组首地址;因此,从以上代码可以得出结论,
当两个数组不是同一数组时,也就是a==a2 不成立。
当满足以下任一条件时:
两个数组中有一个为空时
两个数组长度不等时
两个数组中包含任意不相等的元素时
就认为两个数组不相等,反之则认为相等。对于对象数组,相同位置的对象均为null是,认为是两个相同的元素。
deepequals其他数组交换
这个方法其实挺实用的,以后如果懒得写了,可以直接一行代码搞定。
最后
以上分析是基于java jdk1.8 版本,在java中由于lamdba表达式,函数式编程思想的引入,arrays内部新增了许多相关的类如stream 等,考虑到使用频率,暂时不展开讨论了。返回搜狐,查看更多
责任编辑:
总结
以上是尊龙游戏旗舰厅官网为你收集整理的java arrays方法_java工具类arrays中不得不知的常用方法的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇:
- 下一篇: