此接口对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。
实现此接口的对象列表(和数组)可以通过Collections.sort或者Arrays.sort进行自动排序,这个两个排序实现使用的时快速排序。实现此接口的对象可以用作有序映射(SortedMap<T,V>)中的键或者(SortedSet<T>)中的元素,无需指定比较器。
建议最好使自然排序与equals结果一致。这是因为在使用自然排序与equals不一致时,没有显示比较器的有序集合行为“怪异”,尤其是这样的有序集合违背了根据euqlas方法定义的集合(或者映射表)的常规协定。
java.math.BigDecimal是个例外,自然排序排序值相等,当精确值不等的BigDecimal被视为相等。
一旦数实现了Comparable接口,你就可以跟许多泛型算法以及依赖域该接口的集合实现进行协助。你付出很小的努力就可以获得非常强大的功能。事实上,Java平台类库中的所有值类都实现了Comparable接口。如果你正在编写一个值类,它具有非常明显的内在排序,比如按字母排序、按数字排序或者按照年代排序,那你就坚决考虑实现该接口。
如果一个类有很多关键域,那么按照什么样的顺序来比较这些域非常重要。你必须从最关键的域开始,逐步进行比较,一次带最次要的域。一电话号码为例子。PhoneNumber类的comparaTo方法来作为实例说明:
public class PhoneNumber implements Comparable<PhoneNumber> {
int areaCode;// 区号
int prefix;// 前缀
int lineNumber;// 市号
@Override
public int compareTo(PhoneNumber o) {
// 优先比较区号
int areaCodeDiff = areaCode - o.areaCode;
if (areaCodeDiff != 0) {
return areaCodeDiff;
}
// 跟着比较前缀
int prefixDiff = prefix - o.prefix;
if (prefixDiff != 0) {
return prefixDiff;
}
// 最低优先级比较市号
return lineNumber - o.lineNumber;
}
}