20210120 java.lang.Comparable

java.lang.Comparable

基本信息

  • public interface Comparable<T>
  • rt.jar
  • 引入版本:1.2
  • 相关类:java.util.Comparator

使用说明

  • 此接口对实现该接口的每个类的对象强加了总体排序。此排序称为类的自然排序,而该类的 compareTo 方法被称为其自然比较方法。
  • 实现此接口的对象的列表(和数组)可以由 Collections.sort(和 Arrays.sort)自动排序。实现此接口的对象可以用作排序映射中的键,也可以用作排序集中的元素,而无需指定比较器。
  • 当且仅当 C 类的每一个 e1 和 e2 的 e1.compareTo(e2) == 0 具有与 e1.equals(e2) 相同的布尔值时, C 类的自然序才与 equals 一致。请注意, null 不是任何类的实例,即使 e.equals(null) 返回 falsee.compareTo(null) 也应引发 NullPointerException
  • 强烈建议(尽管不是必需的)自然顺序应与 equals 保持一致。之所以如此,是为了使用集合或 Map 时,表现正常
  • 几乎所有实现 Comparable 的 Java 核心类都具有与 equals 一致的自然顺序。一个例外是 Java.math.BigDecimal ,只有值以及精度都相等 equals 才为 true
  • 该接口是Java Collections Framework的成员。

接口定义方法

接口定义方法
int compareTo(T o)

int compareTo(T o)

  • 将此对象与指定对象进行比较。当此对象小于,等于或大于指定的对象时,返回负整数,零或正整数。
  • 必须确保所有 x 和 y 的 sgn(x.compareTo(y)) == -sgn(y.compareTo(x))。 (这意味着 x.compareTo(y) 必须抛出异常,而 y.compareTo(x)则抛出异常。)
  • 必须确保该关系是 可传递的(x.compareTo(y)>0 && y.compareTo(z)>0) 意味着 x.compareTo(z)>0
  • 必须确保对于所有 z,x.compareTo(y)==0 意味着 sgn(x.compareTo(z)) == sgn(y.compareTo(z))
  • 强烈建议(但并非严格要求 (x.compareTo(y)==0) == (x.equals(y))任何实现Comparable 接口且违反此条件的类都应明确指出这一事实。

示例代码

public class ComparableTest {
    @Test
    public void test() {
        // 只有值以及精度都相等 equals 才为 true
        BigDecimal b1 = new BigDecimal("4.0");
        BigDecimal b2 = new BigDecimal("4.00");
        BigDecimal b3 = new BigDecimal("4.00");
        System.out.println(b1.compareTo(b2));   // 0
        System.out.println(b1.equals(b2));  // false
        System.out.println(b3.compareTo(b2));   // 0
        System.out.println(b3.equals(b2));  // true


        List<MyComparable> myComparables = Arrays.asList(new MyComparable(5), new MyComparable(4), new MyComparable(3));
        System.out.println("排序前:"+myComparables);   // 排序前:[MyComparable{num=5}, MyComparable{num=4}, MyComparable{num=3}]
        Collections.sort(myComparables);
        System.out.println("排序后:"+myComparables);   // 排序后:[MyComparable{num=3}, MyComparable{num=4}, MyComparable{num=5}]
    }
}

class MyComparable implements Comparable<MyComparable> {
    private int num;

    public MyComparable(int num) {
        this.num = num;
    }

    @Override
    public int compareTo(MyComparable other) {
        return num - other.num;
    }

    @Override
    public String toString() {
        return "MyComparable{" + "num=" + num + '}';
    }
}
原文地址:https://www.cnblogs.com/huangwenjie/p/14296606.html