JavalangComparable接口中唯一的方法是compareTo()在该方法中可以进行简单的相等比较以及执行顺序比较接口实现框架如下[java] view plaincopyprint?
public class ComparableImpl implements Comparable<ComparableImpl> {
@Override public int compareTo(ComparableImpl o) { // TODO Autogenerated method stub return }
}一个类实现了Comparable接口则说明它的实例具有内在的排序关系就可以跟多种泛型算法以及依赖于该接口的集合实现进行协作依赖于比较关系的类包括有序集合类TreeSet和TreeMap以及工具类Collections和Arrays若一个数组中的元素实现了Comparable接口则可以直接使用Arrays类的sort方法对这个数组进行排序Java平台库中的所有值类(value classes)都实现了Comparable接口
Comparable的规范说明如下将当前这个对象与指定对象进行顺序比较当该对象小于等于或大于指定对象时分别返回一个负整数零或者正整数如果由于指定对象的类型而使得无法进行比较则抛出ClassCastException异常
compareTo方法的实现必须满足如下几个限制条件自反性对称性传递性和非空性
一般来说comparaTo方法的相等测试应该返回与equals方法相同的结果如果相同则由compareTo方法施加的顺序关系被称为与equals一致如果不同则顺序关系被称为与equals不一致如果一个类的compareTo方法与equals方法的顺序关系不一致那么它仍然能正常工作只是如果一个有序集合包含了该类的实例则这个集合可能无法遵循某些集合接口的通用约定因为集合接口的通用约定是按照equals方法定义的而有序集合使用了由compareTo施加的相等测试下面是实现了Comparable接口的类同时该类还重写了equals和hashCode等方法[java] view plaincopyprint?
public abstract class ZLTextPosition implements Comparable<ZLTextPosition> {
public abstract int getParagraphIndex()public abstract int getElementIndex()public abstract int getCharIndex()
public boolean samePositionAs(ZLTextPosition position) { return getParagraphIndex() == positiongetParagraphIndex() && getElementIndex() == positiongetElementIndex() && getCharIndex() == positiongetCharIndex()}
@Override public int compareTo(ZLTextPosition position) { final int p = getParagraphIndex()final int p = positiongetParagraphIndex()if (p != p) { return p < p ? }
final int e = getElementIndex()final int e = positiongetElementIndex()if (e != e) { return e < e ? }
final int c = getCharIndex()final int c = positiongetCharIndex()if (c != c) { return c < c ? } return }
@Override public boolean equals(Object obj) { if (this == obj) { return true} if (!(obj instanceof ZLTextPosition)) { return false}
final ZLTextPosition position = (ZLTextPosition)objreturn samePositionAs(position)}
@Override public int hashCode() { return (getParagraphIndex() << ) + (getElementIndex() << ) + getCharIndex()}
@Override public String toString() { return getClass()getName() + + getParagraphIndex() + + getElementIndex() + + getCharIndex()}
}