Java学习打卡-Day20-Comparable接口与Comparator接口
学习自Code哈哈笑、拭心
Comparable接口与Comparator接口
Comparable 自然排序
- Comparable 是排序接口。若一个类实现了Comparable接口,就意味着“该类支持排序”。它属于对象本身的一部分,定义了对象之间的默认比较逻辑。
- Comparable 在
java.lang
包下,内部只有一个方法compareTo()
。 - 可以让实现它的类的对象进行比较,通过 Collections.sort() 或 Arrays.sort() 方法进行排序。具体的比较规则是按照 compareTo 方法进行。
- 通过
e1.compareTo(e2)
来比较e1和e2的大小。若返回负数,意味着e1<e2。 - 注意:
- 由于 null 不是一个类,也不是一个对象,因此在重写 compareTo 方法时应该注意 e.compareTo(null) 的情况,即使 e.equals(null) 返回 false,compareTo 方法也应该主动抛出一个空指针异常 NullPointerException。
- Comparable 实现类重写 compareTo 方法时一般要求 e1.compareTo(e2) == 0 的结果要和 e1.equals(e2) 一致。这样将来使用 SortedSet 等根据类的自然排序进行排序的集合容器时可以保证保存的数据的顺序和想象中一致。
Comparator 定制排序
- Comparator 是比较器接口,用于自定义排序。它是一个独立的比较器,与对象本身的定义无关。
- 我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。
- 当需要对同一类的对象应用多种排序规则时,Comparator 更加灵活。
- Comparator 的对象可以作为排序策略参数传递给 Collections.sort() 或 Arrays.sort() 方法,或一些内部有序的集合( SortedSet,SortedMap 等)。
- Comparator 在
java.util
包下,JDK8以前只有compare()
和equals()
两个方法。 - 通过
compare(T e1, T e2)
来比较e1和e2的大小。若返回负数,意味着e1<e2。