T
- 可以将此对象与之进行比较的对象类型
public interface Comparable<T>
Collections.sort
(和Arrays.sort
)可以自动对实现此接口的对象进行列表(和数组)排序。 实现该接口的对象,可以使用如在键sorted map或作为在元件sorted set ,而不需要指定一个comparator 。
一类C的自然顺序被说成是与equals一致当且仅当e1.compareTo(e2) == 0对每一个e1和C类e2相同的布尔值e1.equals(e2)。 请注意, null不是任何类的实例, e.compareTo(null)应该抛出一个NullPointerException即使e.equals(null)返回false 。
强烈建议(尽管不需要)自然排序与等于一致。 这是因为,当没有显式比较器的排序集(和排序映射)与其自然排序与equals不一致的元素(或键)一起使用时会“奇怪地”。 特别地,这种排序集合(或排序映射)违反了根据equals方法定义的集合(或映射)的一般合同。
例如,如果加上两个键a和b,使得(!a.equals(b) && a.compareTo(b) == 0)
(有序集合不增加的大小和),以一有序集合不使用显式的比较器,所述第二add操作返回false因为a和b是等价从排序集的角度。
几乎所有实现Comparable的Java核心类都具有与equals 一致的自然排序。 一个例外是java.math.BigDecimal ,其自然排序等于BigDecimal具有相同值和不同精度(例如4.0和4.00)的对象。
对于数学倾斜,定义给定类C的自然排序的关系是:
{(x, y) such that x.compareTo(y) <= 0}.
这个总订单的商是:
{(x, y) such that x.compareTo(y) == 0}.
它从合同compareTo,该商数是C的等价关系紧接着,那自然排序是C, 总订单 。
当我们说类的自然排序与equals一致的 ,我们的意思是自然排序的商是由类的定义的等价关系equals(Object)
方法:
{(x, y) such that x.equals(y)}.
此接口是成员Java Collections Framework 。
Comparator
int compareTo(T o)
实现程序必须确保sgn(x.compareTo(y)) == -sgn(y.compareTo(x))所有x和y。 (这意味着x.compareTo(y)必须抛出异常iff y.compareTo(x)引发异常。)
实施者还必须确保关系是可传递的: (x.compareTo(y)>0 && y.compareTo(z)>0)表示x.compareTo(z)>0 。
最后,实施者必须确保x.compareTo(y)==0意味着sgn(x.compareTo(z)) == sgn(y.compareTo(z)) ,对于所有z 。
强烈建议,但不要严格要求(x.compareTo(y)==0) == (x.equals(y)) 。 一般来说,任何实现Comparable接口并违反这种情况的类应清楚地表明这一点。 推荐的语言是“注意:此类具有与equals不一致的自然排序”。
在前面的描述中,符号sgn( ) 表达式表示数学符号函数,其定义根据表达式的值是否为负,零或正返回的-1一个,0,或1。
o
- 要比较的对象。
NullPointerException
- 如果指定的对象为空
ClassCastException
- 如果指定的对象的类型阻止它与该对象进行比较。