Arrarys类在Java中存储了一些对数组操作的一些方法,比如Sort(),toString,BinarySearch(),copyof(),fill(),equals(),aList这几种方法,这里面最重要的可能就是Sort()方法,它可以将数组进行排序当然对数组的排序我们之前也学了一个冒泡排序法,也是完全可以使用的,Sort()方法也可以将数组进行排序但是是通过什么代码进行对数组的排序操作的到时候我们会看一下源码,剩下 的方法其实也是比较好懂待会给大家演示一下即可。
toString方法其实没啥好说的就是把数组以字符串的形式输出,BinarySearch(),这个方法比较特别它是二叉排序查找,你必须将数组先排序好才能使用该方法,我们来看一下不排序的后果是什么:
import java.util.Arrays;
public class Array {
public static void main(String[] args) {
Integer[] arr = {1,2,5,3,4};
int index = Arrays.binarySearch(arr, 3);
System.out.println(index);
}
}
这里我们并没有对数组进行排序操作我们这里搜索索引为3的数,按照数组的位置看应该是3,我们来看一下结果是什么
结果却是也跟我们预期的一样并不是3而是-3。
排序过后的会不会正确这里我就先不演示了,感兴趣的朋友可以去尝试一下,copyof()方法顾名思义就是将旧数组完完全全的复制给新数组,fill()这个方法其实就是将数组中的元素按照数组的长度全部替换成指定元素,equals()这个方法我们之前也是聊过的,就是比较的方法,在这里就是数组之间的比较,两个数组完全一样则返回true,不同则返回false(这里的顺序也是必须是一致的,顺序不一致也是返回false),接下来我们重点讲一下Sort()方法的细节和使用
Sort()方法我们之前说的是排序,但是它是正排序还是倒排序我们就来了解一下,但是如果我们想按照自己的排序方法又该怎么办,接下来给大家进行详细分析:
import java.util.Arrays;
public class Array {
public static void main(String[] args) {
Integer[] arr = {1,2,5,3,4};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
}
}
这里我们直接使用默认的sort()这个方法对我们的数组进行遍历,输出数组的时候一定要注意要么遍历数组,要么使用Arrarys的toString()方法,否则输出的是默认的地址段,这里我们看一下输出的结果是正排序
当然你也可以使用冒泡排序法来进行排序,而且冒泡排序法也是可以自主的调换自己想要的排序方法,这个大家应该都是了解的,接下来我们就要来将一个接口方法也是Arrarys的sort()的一个重载方法,这里我们应用的接口名为Comparator这是我们Java中的一个比较器,我们待会在进行排序的时候我们会看源码,那我们不传入接口参数的时候是怎么进行比较的我们来看一下。
这里我们发现没有传入比较器的话,代码会自动会自动的调用默认的比较器,进行默认的排序,
这里我们 也可以传入比较器:
import java.util.Arrays;
import java.util.Comparator;
public class aaa {
public static void main(String[] args) {
int[] arr = {1, -3, 34, 20, -7};
System.out.println(Arrays.toString(arr));
//这里使用匿名内部类的方式
bulle1(arr, new Comparator(){
@Override
public int compare(Object o1, Object o2) {
int n1 = (Integer) o1;
int n2 = (Integer) o2;
return n2 - n1;//通过返回值的正负来确定排序顺序。
}
});
System.out.println(Arrays.toString(arr));
}
//这里我们默认设置的比较器是通过冒泡排序的方式进行排序
//不同的是它的比较大小的方法不同,它通过c.compare()通过动态绑定自动定位到c中的compare这个方法
public static void bulle1(int[] arr, Comparator c){
int temp = 0;
for (int i = 0; i < arr.length - 1 ; i++) {
for(int j = 0; j < arr.length - i - 1; j++){
if (c.compare(arr[j],arr[j + 1]) > 0){
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
}
这里我们首先得知道冒泡排序到底是如何实现对数组进行排序的,如果这个原理不知道,自定义的比较器的执行是比较困难的,也建议大家先去了解一下冒泡排序的原理,这里我们使用匿名内部类的方式传入我们的比较器的原因是因为这样比较方便不需要进行实现接口的操作,而且可以随时修改自己想要的代码,在我们测试代码的时候尽量的不要去修改原代码,所以这也是匿名内部类在源码中广泛出现的原因。这里我们给大家看一下俩种结果
1.正排序:
即return n1 - n2
2.倒排序:
即return n2 - n1
这里就是全部内容,大家可以试着DeBug一下看看在c.compare()的时候会不会动态绑定到我们的匿名内部类的方法上,如果大家对这个返回值定排列顺序还是不理解的话,你可以试着这么理解:
俩组完全相同的数比较,但是返回值是相反的就可以了。