Java Comparable接口分析与实践

此接口对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的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;
    }

}

你可能感兴趣的:(Comparable)