目录
常用方法:
toString: 将数组转化成字符串
binarySearch: 二分查找法查找元素
copyOf: 拷贝数组
copyOfRange: 拷贝数组(指定范围)
sort: 排序
注意:sort函数的重载
常用方法:
(省流废话)前面的方法其实都很简单,看一下语法就会用,小伙伴们象征看看当复习也可以,重点在于最后sort的方法。
toString: 将数组转化成字符串
语法:Arrays.toString(数组)
int[] arr = {1, 2, 3, 4, 5};
System.out.println(Arrays.toString(arr));
binarySearch: 二分查找法查找元素
注意:Arrays里的binarySearch只能对升序数组进行查找。
若元素不存在数组中,方法会假设这个元素存在这个数组中(按升序排序),返回一个整数(这个整数是元素如果存在于该数组中的位置索引的负数减一的值)。
语法:Arrays.binarySearch(数组,元素)
System.out.println(Arrays.binarySearch(arr, 3));//2
System.out.println(Arrays.binarySearch(arr, 6));//-6
copyOf: 拷贝数组
要求指定新数组长度,指定长度大于原数组长度,在多出来的位置补充默认值;
小于原数组长度,则只拷贝部分原数组元素。
语法:Arrays.copyOf(数组,新数组长度)
int new_arr1[] = Arrays.copyOf(arr, 10);
int new_arr2[] = Arrays.copyOf(arr, 3);
System.out.println(Arrays.toString(new_arr1));//[1, 2, 3, 4, 5, 0, 0, 0, 0, 0]
System.out.println(Arrays.toString(new_arr2));//[1, 2, 3]
copyOfRange: 拷贝数组(指定范围)
指定拷贝的起始索引和结束索引(结束索引的元素不被拷贝)(包头不包尾)
语法:Arrays.copyOfRange(数组,起始索引,结束索引)
int new_arr3[] = Arrays.copyOfRange(arr, 1, 3);
System.out.println(Arrays.toString(new_arr3));//[2, 3]
sort: 排序
默认情况指为基本数据类型进行升序排序,底层使用逻辑的是快速排序(关于一些常见的排序方法在常见算法:排序(java)有介绍)
语法:Arrays.sort(数组)
int arr2[] = {6, 1, 2, 3, 4, 5};
Arrays.sort(arr2);
System.out.println(Arrays.toString(arr2));//[1, 2, 3, 4, 5, 6]
注意:sort函数的重载
(这个大概是本篇里比较有难度的点)
语法:Arrays.sort(数组,排序规则)
细节:这个方法只能给引用数据类型的数组进行排序,当然,java现在是很智能的,有自动装箱拆箱的机制(即自动将基础类型与对应的包装类进行相互转化),因此我们传入基础数据类型的数组也是完全没问题哒。(好吧,打脸了,实测直接传入基础数据类型idea会报错QAQ,还是老老实实手动将数组打包成包装类吧)
打包语法:包装类[] 新数组名 = Arrays.stream(要打包的数组).boxed().toArray(包装类[]::new)
值得一提的是,Arrays.stream()似乎是不支持float类型的数组的,建议使用double数组保存浮点数数据。
int arr3[] = {1, 2, 3, 4, 5, 6};
//这里演示的是将int数组转为Integer数组
Integer[] arr4 = Arrays.stream(arr3).boxed().toArray(Integer[]::new);
在底层代码里,参数里的排序规则是一个接口,所以我们在调用方法时,需要传入这个接口的实现类对象。 但是这个实现类我们通常只需要使用一次,再去为它定义一个类是不是太麻烦啦?
因此,我们可以采取匿名内部类的方式来完成这个规则即可,省时省力。(博主是新人菜鸡,之前没有写博客的习惯,所以这里没有匿名内部类的介绍链接,诶嘿。之后有写的话就回来更新(大概))。下面我们简单写一个降序作为排序规则的sort,比较的规则自然就是内部类里的compare()方法啦。
Arrays.sort(arr4, new Comparator
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
System.out.println(Arrays.toString(arr4));//[6,5,4,3,2,1]
compare方法里的两个参数,o1表示在无序序列中遍历得到的每一个元素,o2表示有序序列中的元素。
简单介绍一下底层原理(这一段是黑马java视频里的总结):
利用插入排序 + 二分查找的方式进行默认把0索引的数据当作有序数组,后面的部分认为是无序数组遍历无序的序列得到里面的每一个元素,假设当前遍历得到的元素是A元素把A元素往有序序列中进行插入,用二分查找确定A元素的插入点将A元素与插入点的元素进行比较,比较的规则就是compare方法的方法体如果方法的返回值是负数,拿着A继续跟前面的数据进行比较如果方法的返回值是整数,拿着A继续跟后面的数据进行比较如果方法的返回值是0,也拿着A继续跟后面的数据进行比较直到确定A的最终位置为止
当然,也可以偷懒,只记住o1-o2是升序排序,o2-o1是降序排序即可。