Comparable 和 Comparator 都是接口,均为比较器
Comparable相当于“内比较器”,而Comparator相当于“外比较器”
实现Comparable的类,该类就具有自身比较的功能;Comparator的实现,是一个外部比较0工具器
注意Comparable 和 Comparator 同时实现时,则以Comparator为主
Comparable 接口
Comparable 被认为是内比较器,也是自然排序,实现该接口的类,会有自身比较的功能,则依赖compareTo方法的实现
CompareTo方法的返回值是int,有三种情况:
1、比较者大于被比较者,那么返回正整数
2、比较者等于被比较者,那么返回0
3、比较者小于被比较者,那么返回负整数
// Comparable 接口的定义 public interface Comparable<T> { public int compareTo(T o); }
例子:String 本身就以实现Comparable ,所以可以调用它的compareTo方法进行比较
class Person implements Comparable{ // 其他属性 @Override public int compareTo(Person p){ int temp = this.age - p.age; return temp == 0 ? this.name.compareTo(p.name) : temp; } }
Comparator接口
Comparator 被认为是外比较器,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口覆盖compare(T o1, T o2)方法,即可,然后通过这个比较器对类进行比较且排序
compare(T o1, T o2)方法,int返回值有三种情况:
1、o1大于o2,返回正整数
2、o1等于o2,返回0
3、o1小于o3,返回负整数
有两种场景可以使用实现Comparator接口的方式:
1、一个对象不支持自己和自己比较(没有实现Comparable接口),但是又想对两个对象进行比较
2、一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是如他所愿
例子:
public class PersonComparator implements Comparator<Person> { @Override public int compare(Person p1, Person p2) { int temp = p1.getName().compareTo(p2.getName); return temp == 0 ? p1.getAge() - p2.getAge() : temp; } }