公子姓王

导航

Java容器解析系列(8) Comparable Comparator

ComparableComparator接口是两个用于对对象进行大小比较的接口,在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);

}

posted on 2018-10-12 16:57  公子姓王  阅读(140)  评论(0编辑  收藏  举报