此接口所属于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
    }
}
版权声明
本文作者 珂泽
本文链接 https://www.kezez.com/archives/40.html
共享协议 CC BY-NC-SA 4.0
引用规则 非商业转载及引用请注明出处(作者、原文链接),商业转载请联系作者获得授权。
QQ 群组 962303102
最后修改:2022 年 02 月 04 日
如果觉得我的文章对你有用,请随意赞赏