此接口所属于Java集合框架
接口定义
该接口对实现它的每个类的对象进行了总排序。 这种排序称为类的自然排序,类的compareTo方法称为其自然比较方法。
实现此接口的对象列表(和数组)可以由Collections.sort (和Arrays.sort )自动排序。 实现此接口的对象可以用作排序映射中的键或排序集中的元素,而无需指定比较器。
当且仅当e1.compareTo(e2) == 0类C的每个e1和e2具有与e1.equals(e2)相同的布尔值时,类C的自然排序被称为与 equals 一致。 请注意, null不是任何类的实例,即使e.equals(null)返回false , e.compareTo(null)也应该抛出NullPointerException 。
强烈建议(尽管不是必需的)自然排序与 equals 一致。 之所以如此,是因为没有显式比较器的排序集(和排序映射)在与自然顺序与等于不一致的元素(或键)一起使用时表现“奇怪”。 特别是,这样的排序集合(或排序映射)违反了集合(或映射)的一般合同,该合同是根据equals方法定义的。
例如,如果添加两个键a和b使得(!a.equals(b) && a.compareTo(b) == 0)到不使用显式比较器的排序集,则第二个add操作返回 false (并且排序集的大小不会增加)因为从排序集的角度来看a和b是等价的。
几乎所有实现Comparable的 Java 核心类都具有与 equals 一致的自然顺序。 一个例外是java.math.BigDecimal ,它的自然排序等同于具有相同值和不同精度(例如 4.0 和 4.00)的BigDecimal对象。
对于数学倾向,定义给定类 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)}.
Comparable接口内有compareTo 方法,compareTo 方法将当前对象与传入的指定类型对象进行比较,当此对象小于、等于或者大于的时候返回负整数、零或者正整数。
使用compareTo 方法必须确保sgn(x.compareTo(y)) == -sgn(y.compareTo(x))
否则将会抛出异常。当然也需要确保 (x.compareTo(y) > 0 && y.compareTo(z) > 0) implies x.compareTo(z) > 0.
相等的情况也是如此。
实例代码
package cn.vwmwv.generics;
public class G2 {
public static <T extends Comparable<T>> T maximum(T x,T y,T z){
T max = x;
if (y.compareTo(max) > 0)max=y;
if (z.compareTo(max) > 0)max=z;
return max;
}
public static void main(String[] args) {
System.out.println(maximum(3,4,5)); // 输出5
System.out.println(maximum("ab","ac","aa")); // 输出ac
}
}