Comparable
和Comparator
接口是两个用于对对象进行大小比较的接口,在java集合相关类中,也被经常地使用到.
关于其使用,可以参考网络上的其他博客(没什么好说的);这里阐述关于这两个接口的区别,直接看源码即可:
package java.lang;
// 在java.lang包下
/**
* 该接口的实现类:
* 1. 本身具有排序的能力,我们称之为该类的自然排序,其compareTo()方法就称为该类的自然排序方法;
* 2. 数组或List,可以使用Collections.sort(List)或 Arrays.sort(Object[])方法进行排序;
* 3. 可以直接作为SortedMap/SortedSet的key,而不需要指定Comparator
* 4. 几乎所有的Java核心库类都实现了Comparable接口,并且与equals()方法保持一致.但是java.math.BigDecimal除外,它的自然排序将值相等但精确度不同的 BigDecimal 对象(比如 4.0 和 4.00)视为相等。
* @since 1.2
*/
public interface Comparable<T> {
/*
与指定对象o进行比较;
如果o为null,抛出NullPointerException;
返回值:
比o小,返回负数;
和o相等,返回0;
比o大,返回正数;
实现类必须保证:
1. x.compareTo(y) = -y.compareTo(x),而且如果x.compareTo(y)抛出异常,那么y.compareTo(x)也必须抛出异常;
2. 比较关系是有传递性的:如果x.compareTo(y) < 0,y.compareTo(z) < 0,可以推导出x.compareTo(z) < 0
强烈推荐该方法实现和equals()保持一致,如果x.compareTo(y)=0,则x.equals(y)
*/
public int compareTo(T o);
}
package java.util;
// 在java.util包下
/**
* Comparator接口表示一个比较器;
* 该接口的实现类:
* 1. 被传入排序方法Collections.sort(List,Comparator)或 Arrays.sort(Object[],Comparator)进行排序,指定排序方式;
* 2. 被传入SortedMap/SortedSet,提供key的排序方式;
* 3. 与Comparable不同,Comparator实现类可能允许与null比较;
* @since 1.2
*/
public interface Comparator<T> {
// 同Comparable.compareTo()
// 只不过这里是指定了两个对象而已,而Comparable对象自身就是被比较对象,相当于这里的o1
int compare(T o1, T o2);
// 比较是否是同一个Comparator
boolean equals(Object obj);
}