- Java修炼指南:高频源码解析
- 开课吧组编 曹子方 杨富杰 刘常凯等编著
- 1498字
- 2021-04-22 17:10:52
2.1 集合工具类的重要类——Arrays类
Java. util. Arrays类是JDK提供的一个工具类,用来处理数组的各种方法,而且每个方法基本上都是静态方法,能直接通过类名Arrays调用。
2.1.1 asList方法
该方法的作用是返回由指定数组支持的固定大小列表。
注意:
这个方法返回的ArrayList不是常用的集合类Java. util. ArrayList。这里的ArrayList是Arrays的一个内部类Java. util. Arrays. ArrayList。这个内部类有如下属性和方法:
1)返回的ArrayList数组是一个定长列表,只能对其进行查看或者修改,但是不能进行添加或者删除操作。
如果对其进行增加或者删除操作,都会调用其父类AbstractList对应的方法,而追溯父类的方法最终会抛出UnsupportedOperationException异常。代码如下:
2)用类型的数组和基本类型的数组区别。
上面的结果第一个listStr. size()= =3,而第二个listI. size()= =1。这是为什么呢?
在Arrays. asList源码中,方法声明为<T>List<T>asList(T. . . a)。该方法接收一个可变参数,并且这个可变参数类型是作为泛型的参数。基本数据类型是不能作为泛型的参数的,但是数组是引用类型,所以数组是可以泛型化的,于是int []作为整个参数类型,而不是int作为参数类型。
所以将上面的方法泛型化补全,代码如下。
3)返回的列表ArrayList里面的元素都是引用,不是独立出来的对象。
这里的Arrays. toString()方法就是打印数组的内容,后面会介绍。这里修改集合的内容,原数组的内容也发生变化了,所以这里传入的是引用类型。
4)已知数组数据,如何快速获取一个可进行增删改查的列表List?
这里的ArrayList集合类后面会详细讲解,目前只需要知道有这种用法即可。
5)Arrays. asList()方法使用场景。
Arrays工具类提供了一个方法asList,使用该方法可以将一个变长参数或者数组转换成List。但是,生成的List的长度是固定的;能够进行修改操作(比如修改某个位置的元素);不能执行影响长度的操作(如add、remove等操作),否则会抛出UnsupportedOperationException异常。
所以Arrays. asList比较适合那些已经有数组数据或者一些元素,而需要快速构建一个List,只用于读取操作,而不进行添加或删除操作的场景。
2.1.2 sort方法
该方法是用于数组排序,在Arrays类中有该方法的一系列重载方法,它能对7种基本数据类型,包括byte、char、double、float、int、long、short进行排序,还有Object类型(实现了Comparable接口)以及比较器Comparator。
1. 基本类型数组
这里以int[]为例:
通过调用sort(int[] a)方法,将原数组按照升序的顺序排列。下面通过源码来看如何实现排序,sort方法代码如下所示。
在Arrays. sort方法内部调用DualPivotQuicksort. sort方法,这个方法的源码很长,分别对于数组的长度进行了各种算法的划分,包括快速排序、插入排序、冒泡排序等。读者可以在源码当中认真阅读。
2. 对象类型数组
该类型的数组进行排序可以实现Comparable接口,重写compareTo方法进行排序。
String类型实现了Comparable接口,内部的compareTo方法是按照字典码进行比较的。
3. Comparator自定义排序
没有实现Comparable接口的,可以通过Comparator实现排序。
2.1.3 binarySearch方法
用binarySearch方法查找数组中的某个元素。该方法和sort方法一样,适用于各种基本数据类型以及对象。
注意:
binarySearch方法是对已经有序的数组进行查找(比如先用Arrays. sort()进行排序,然后调用此方法进行查找)。找到元素返回下标,没有则返回 -1。
实例代码如下:
具体源码实现如下:
2.1.4 copyOf方法
copyOf方法用于拷贝数组元素。底层采用System. arraycopy()实现,这是一个native方法。
src:源数组;
srcPos:源数组要复制的起始位置;
dest:目的数组;
destPos:目的数组放置的起始位置;
length:复制的长度。
注意:
src和dest都必须是同类型或者可以进行转换类型的数组。
2.1.5 equals和deepEquals方法
1. equals
equals用来比较两个数组中对应位置的每个元素是否相等。
equals对8种基本数据类型以及对象都能进行比较。
先看int类型的数组比较,源码实现如下:
再看对象数组的比较:
上述代码也是通过equals来判断。
2. deepEquals
该方法也是用来比较两个数组的元素是否相等,不过deepEquals能够比较多维数组,而且是任意层次的嵌套数组。
2.1.6 fill方法
该方法用于给数组赋值,并能指定某个赋值范围。
2.1.7 toString和deepToString方法
toString用来打印一维数组的元素,而deepToString用来打印多层次嵌套的数组元素。