java.lang.Comparable
该接口定义了唯一的方法:
public int compareTo(T o);
比较接口,实现了该接口的类的所有对象就能够被比较,就具备了自然排序能力(nature ordering)。支持排序的容器的基础排序就是调用compareTo方法的,如TreeMap。实现了Comparable接口的类,可以用Collections.sort(List<T> list) ,Arrays.sort(Object[] a) 来排序。
compareTo方法的入参不能为null,否则运行时会报NullPointerException. 因为该方法会调用入参的属性值进行比较。
java.util.Comparator
@FunctionalInterface
public interface Comparator<T> {default Comparator<T> reversed(){...}default Comparator<T> thenComparing(Comparator<? super T> other) {...}default <U> Comparator<T> thenComparing(Function<? super T, ? extends U> keyExtractor,Comparator<? super U> keyComparator){...}default <U extends Comparable<? super U>> Comparator<T> thenComparing(Function<? super T, ? extends U> keyExtractor){...}default Comparator<T> thenComparingInt(ToIntFunction<? super T> keyExtractor) {...}default Comparator<T> thenComparingLong(ToLongFunction<? super T> keyExtractor) {...}default Comparator<T> thenComparingDouble(ToDoubleFunction<? super T> keyExtractor) {...}...
}
比较器接口,可以基于该接口定义需要的比较器。该类是一个函数式接口,接口里有一些常用的比较方法的默认实现,可以直接调用,比Comparable更灵活,能够构造复杂的比较逻辑,可以认为是对Comparable的增强。
// 定义两个比较器,进行两个维度的比较
list.sort(Comparator.comparingInt(Student::textbookScore).thenComparingInt(Student::physicalScore)
);