1.Arrays工具类:
Arrays
类是java.util
包的操作数组的工具类,提供了大量用于操作数组的静态方法。
转字符串方法
toString(Object[] a)
:返回数组内容的字符串表示。
搜索方法
binarySearch(Object[] a, Object key)
:在已排序的数组中搜索指定对象,使用二分查找法。
填充方法
fill(Object[] a, Object val)
:用指定值填充整个数组。
比较方法
equals(Object[] a, Object[] a2)
:比较两个数组是否相等。
复制方法
copyOf(Object[] original, int newLength)
:复制数组到新数组,并可以指定新数组的长度。
排序方法
sort(Object[] a)
:对指定对象数组进行升序排序。sort(Object[] a, Comparator<? super T> c)
:根据自定义的排序规则对数组进行排序。- 只能给引用数据类型数组排序
Comparator
是一个(函数式)接口,需要传递实现这个接口的对象作为规则,想到匿名内部类。- 底层是插入+二分
- 排序规则返回值简单记忆为:
- o1-o2:升序排序
- o2-o1:降序排序
示例:
public static void main(String[] args) {
int[] arr1={7,5,2,1,9,8,3,6,4};
Arrays.sort(arr1);
System.out.println(Arrays.toString(arr1));
//sout:[1, 2, 3, 4, 5, 6, 7, 8, 9]
Integer[] arr2={7,5,2,1,9,8,3,6,4};
Arrays.sort(arr2, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
System.out.println(Arrays.toString(arr2));
//sout:[9, 8, 7, 6, 5, 4, 3, 2, 1]
}
2.Lambda表达式
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
标准格式:
( 方法的形参 )->{ 方法体 }
- 可以用来简化匿名内部类的书写
- 只能简化函数式接口()的匿名内部类
- 有且只有一个抽象方法的接口叫做函数式接口 :注解@FunctionalInterface
- 可以有其他的默认方法和静态方法
- 有且只有一个抽象方法的接口叫做函数式接口 :注解@FunctionalInterface
以上文sort为例,可以简化为:
Integer[] arr1={7,5,2,1,9,8,3,6,4};
Arrays.sort(arr1,(Integer o1,Integer o2) ->{return o2-o1;});
System.out.println(Arrays.toString(arr1));
//sout:[9, 8, 7, 6, 5, 4, 3, 2, 1]
省略规则:
- 参数类型可以省略不写
- 如果只有一个参数,参数类型可以省略,同时()也可以省略。
- 如果Lambda表达式的方法体只有一行,大括号、分号、return可以省略,但需要同时不写
如上文sort,可以再次简化为:
Integer[] arr1={7,5,2,1,9,8,3,6,4};
Arrays.sort(arr1,(o1, o2) -> o2-o1);
System.out.println(Arrays.toString(arr1));
//sout:[9, 8, 7, 6, 5, 4, 3, 2, 1]
另外,阅读Comparator源码,发现发现有int compare(T o1, T o2);和boolean equals(Object obj);两个抽象函数,但注解/编译器并没有报错,这是因为equals 方法继承自Object 父类,不会影响 Comparator
是否符合函数式接口的条件。根据函数式接口的定义,只有用户自己定义的抽象方法才会被计算在内。