Comparator 与 Comparable 的区别
(This interface imposes a total ordering on the objects of each class that implements it. This ordering is referred to as the class's natural ordering, and the class's compareTo method is referred to as its natural comparison method.)
Comparable:从上述关于 Comparable 的接口描述可以看出,一个类在一开始就实现了此接口,就可以通过实现 compareTo() 方法来定义内在的比较方法,是创建类时就定义好的。比如 java.util.Date 类中的比较方法:
1 public int compareTo(Date anotherDate) { 2 long thisTime = getMillisOf(this); 3 long anotherTime = getMillisOf(anotherDate); 4 return (thisTime<anotherTime ? -1 : (thisTime==anotherTime ? 0 : 1)); 5 }
Comparator:一些类在最初时没有实现 Comparable 接口,该类内部就无比较方法,在多数情况下需要比较该类时,就可以创建该类的比较器类,比如 Person 类,可以创建 PersonComparator 类(继承 Comparator 接口),用新创建的 PersonComparator 来实现比较方法,该类内部通过实现 compare(Person p1, Person p2)方法来定义比较的方法。
感觉经过一段时间之后,很容易忘掉这两个接口的区别。今天突然有了一些灵感,就记住了,于是就记录下来:
Comparable:类一开始就实现了该接口,从英语也可以看出,单词后缀为 able(此后缀意指“可.......的”),说明该类实现此接口是可以比较的。于是通过实现 compareTo(T o) 方法,这个方法是指这个类可以跟 o 作比较。
1 public interface Comparable<T> { 2 public int compareTo(T o); 3 }
Comparator:虽然上面的接口很好用,类“自带”比较方法,作者很有预见性嘛。但是如果一开始你自己创建的类没有实现上面上面的接口怎么办,总不可能事事都能有所预见吧?于是乎这个 Comparator 接口就发挥了大用处了,怎么说呢? 当然是再来看后缀啦,单词后缀 or(表人或物),就是说我另外创建一个“比较器”不就可以了嘛!于是就创建一个比较器类,如上述的 PersonComparator。于是乎就有了下面这个方法,怎么比较呢?用外在类的方法来比较,比较的是两个对象 var1 和 var2 。
int compare(T var1, T var2);