Comparable 和 Comparator 两者之间的区别:
一个类实现了 Comparable 接口,意味着该类的对象可以直接进行比较(排序),但比较(排序)的方式只有一种,很单一。
一个类如果想要保持原样,又需要进行不同方式的比较(排序),就可以定制比较器(实现 Comparator 接口)。
Comparable 接口在 java.lang 包下,而 Comparator 接口在 java.util 包下。总而言之,如果对象的排序需要基于自然顺序,请选择 Comparable,如果需要按照对象的不同属性进行排序,请选择 Comparator。
一、Comparable
Comparable 接口的定义非常简单,源码如下所示。
public interface Comparable<T> {
int compareTo(T t);
}
如果一个类实现了 Comparable 接口(只需要干一件事,重写 compareTo() 方法),就可以按照自己制定的规则将由它创建的对象进行比较。下面给出一个例子。
public class Cmower implements Comparable<Cmower> {
private int age;
private String name;
public Exa(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public int compareTo(Exa o) {
return this.getAge() - o.getAge();
}
public static void main(String[] args) {
Cmower wanger = new Exa(11,"666");
Cmower wangsan = new Exa(12,"777");
}
}
二、Comparator
Comparator 接口的核心的方法只有两个.
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
第一个方法 compare(T o1, T o2) 的返回值可能为负数,零或者正数,代表的意思是第一个对象小于、等于或者大于第二个对象。
第二个方法 equals(Object obj) 需要传入一个 Object 作为参数,并判断该 Object 是否和 Comparator 保持一致。
有时候,我们想让类保持它的原貌,不想主动实现 Comparable 接口,但我们又需要它们之间进行比较,可以继承并重写Comparator中的方法。