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) 返回 false , e.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 + '}';
}
}