考虑实现 Comparable 接口——《effective Java》第三版


       compareTo 方法并没有在 Object 类中声明。相反,它是Comparable 接口中唯一的方法。compareTo 方法不但允许进行简单的等同性比较,而且允许执行顺序比较,除此之外,它与 Object 的 equals 方法具有相似的特征,它还是个泛型(generic)。类实现了 Comparable 接口,就表明它的实例具有内在的排序关系(natural ordering)。为实现 Comparable 接口的对象数组进行排序就这么简单:Arrays.sort(a);对存储在集合中的 Comparable 对象进行搜索、计算极限值以及自动维护也同样简单。例如,下面的程序依赖于实现了 Comparable 接口的 String 类,它去掉了命令行参数列表中的重复参数,并按字母顺序打印出来:
public class WordList {
public static void main(String[] args){
Set<String>s = new TreeSet<>();
Collections.addA11(s, args);
System.out.printin(s);

}

}
       一旦类实现了 Comparable 接口,它就可以跟许多泛型算法(generic algorithm)以及依赖于该接口  的集合实现(collection implementation)进行协作。你付出很小的努力就可以获得非常强大的功能。事实上,Java 平台类库中的所有值类(value classes),以及所有的枚举类型都实现了 Comparable 接口。如果你正在编写一个值类,它具有非常明显的内在排序关系,比如按字母顺序、按数值顺序或者按年代顺序,那你就应该坚决考虑实现 Comparable 接口:
public interface Comparable<T> {
int compareTo(T t);

}
compareTo 方法的通用约定与 equals 方法的约定相似:
       将这个对象与指定的对象进行比较。当该对象小于、等于或大于指定对象的时候,分别返回一个负整数、零或者正整数。如果由于指定对象的类型而无法与该对象进行比较,则抛出ClassCastException 异常。
       在下面的说明中,符号 sgn(expression)表示数学中的 signum 函数,它根据表达式(expression)的值为负值、零和正值,分别返回-1、0 或 1。
      #实现者必须确保所有的 x和 y都满足 sgn(x.compareTo(y))==-sgn(y.com-pareTo(x))。(这也暗示着,当且仅当y.compareTo(x)抛出异常时,x.com-pareTo(y)才必须抛出异常。
      #实现者还必须确保这个比较关系是可传递的:(x.compareTo(y)>0 &&y.compareTo(z)>0)暗示着x.compareTo(z)>0。
      #最后,实现者必须确保x.compareTo(y)== 0 暗示着所有的 z都满足 sgn (x.compareTo(z))==sgn(y.compareTo(z))。
      #强烈建议(x.compareTo(y)== 0)==(x.equals(y)),但这并非绝对必要。
一般说来,任何实现了Comparable 接口的类,若违反了这个条件,都应该明
确予以说明。推荐使用这样的说法:“注意:该类具有内在的排序功能,但是与
equals 不一致。”



 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值