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;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值