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 + '}';
}
}