Arrays类api详解
- 前言-Arrays介绍
- 一、toString() 打印数组
- 二、fill() 填充数组
- 三、equals() 比较数组元素是否相等
- 四、asList() 数组转列表
- 五、copyOf() 和 copyOfRange() 拷贝数组
- 六、sort() 数组排序
- 七、binarySearch() 二分查找法找指定元素的索引(下标)
前言-Arrays介绍
该类包含用于操作数组的各种方法(如排序和搜索)。 该类还包含一个静态工厂,可以将数组视为列表。
如果指定的数组引用为空,则该类中的方法都抛出一个NullPointerException ,除非另有说明。
一、toString() 打印数组
int arr[] = {1,3,5,2,9};
String arrString = Arrays.toString(arr);/
System.out.println(arrweString);
二、fill() 填充数组
int[] arr1 = new int[4];
int[][] arr2 = new int[4][4];
Arrays.fill(arr1, 1); //填充一维数组
for (int[] value : arr2) { //填充二维数组
Arrays.fill(value, 1);
}
System.out.println(Arrays.toString(arr1));
System.out.println("============");
for (int[] ints : arr2) {
System.out.println(Arrays.toString(ints));
}
三、equals() 比较数组元素是否相等
int[] arr3 = new int[]{1, 2, 3, 4};
int[] arr4 = new int[]{1, 2, 3, 4};
int[] arr5 = new int[]{1, 2, 3, 5};
System.out.println("============");
System.out.println("arr3和arr4是否相等?"+Arrays.equals(arr3, arr4));
System.out.println("arr3和arr5是否相等?"+Arrays.equals(arr3, arr5));
注:如果是arr3.equals(arr4),则返回false,因为equals比较的是两个对象的地址,不是里面的数。
而Arrays.equals重写了equals,所以,这里可以比较数组中的元素是否相等。
四、asList() 数组转列表
String[] arr6 = {"aa", "bb", "cc"};
Integer[] arr7 = {1, 2, 3, 5}; //注意这里不能用int
List<String> list1 = Arrays.asList(arr6);
List<Integer> list2 = Arrays.asList(arr7);
//list1.add("c"); UnsupportedOperationException
//推荐写法:将asList返回的对象转换为List对象
String[] arr8 = {"a", "b", "c"};
List<String> list3 = new ArrayList<>(Arrays.asList(arr8));
list3.add("d"); //正常使用
System.out.println(list3);
注:asList()方法把数组转换成集合时,不能使用其修改集合相关的方法,如果使用修改集合相关的方法add/remove/clear方法会抛出java.lang.UnsupportedOperationException的异常。原因是这个ArrayList是Arrays的内部类,ArrayList虽然实现了List接口,但是并没有重写add和remove方法,重写了get和set等方法。我没讲清楚的地方,大家可以看源码。
五、copyOf() 和 copyOfRange() 拷贝数组
String[] arr9 = {"a1", "b1", "c1"};
String[] arr10 = Arrays.copyOf(arr9, arr9.length); //参数1是原数组,参数2是新数组长度,多的用null补全
String[] arr11 = Arrays.copyOfRange(arr9, 0, 1); //拷贝数组的某个范围
System.out.println(Arrays.toString(arr10)); //[a1, b1, c1]
System.out.println(Arrays.toString(arr11)); //[a1]
六、sort() 数组排序
sort()基本算法是Dual-Pivot Quicksort(对称快速排序),它是快速排序算法的自定义实现,以获得更好的性能。方法是单线程的。
1.数字排序
int[] intArray = new int[] { 4, 1, 3, -23 };
Arrays.sort(intArray);//输出: [-23, 1, 3, 4]
2.字符串排序,先大写后小写
String[] strArray = new String[] { “z”, “a”, “C” };
Arrays.sort(strArray);//输出: [C, a, z]
3.严格按字母表顺序排序,也就是忽略大小写排序 Case-insensitive sort
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);//输出: [a, C, z]
4.反向排序, Reverse-order sort
Arrays.sort(strArray, Collections.reverseOrder());//输出:[z, a, C]
5.忽略大小写反向排序 Case-insensitive reverse-order sort
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
Collections.reverse(Arrays.asList(strArray));//输出: [z, C, a]
6.选择数组指定位置进行排序
int[] arr = {3,2,1,5,4};
Arrays.sort(arr,0,3);//给第0位(0开始)到第3位(不包括)排序
String str = Arrays.toString(arr); // Arrays类的toString()方法能将数组中的内容全部打印出来
System.out.print(str);//输出:[1, 2, 3, 5, 4]
7.使用比较器自定义排序,适用于多个比较维度
Integer[] arr12 = {11, 21, 33, -55, 44};
Arrays.sort(arr12, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1; //倒序 升序:o1-o2
}
});
补充:parallelSort()
parallelSort()它本质上使用并行的sort-merge(合并排序)算法。它将数组拆分成子数组,子数组本身进行排序,然后合并。对于执行的并行任务,它使用ForkJoin池。它只在满足特定条件时才使用并行特性。如果数组小于或等于8192,或者处理器只有一个核心,那么它使用顺序Dual-Pivot快速排序算法。否则,它使用并行排序。
简单一句话,大数据量、多核用parallelSort()性能更好。
七、binarySearch() 二分查找法找指定元素的索引(下标)
前提:数组一定是排好序的,否则会出错。如果有重复元素则返回最后一个元素的下标。
int[] arr = {10,20,30,40,50};
System.out.println(Arrays.binarySearch(arr, 30)); //输出:2 (下标索引值从0开始)
System.out.println(Arrays.binarySearch(arr, 36));//输出:-4 (找不到元素,返回-x,从-1开始数,如题,返回-4)
System.out.println(Arrays.binarySearch(arr, 0,3,30));//输出:2 (从0到3位(不包括)找30,找到了,在第2位,返回2)
System.out.println(Arrays.binarySearch(arr, 0,3,40));//输出:-4 (从0到3位(不包括)找40,找不到,从-1开始数,返回-4)