Java排序接口Comparable和Comparator

words introduction

comparable 英 [ˈkɒmpərəbl] 美 [ˈkɑ:mpərəbl]
adj.可比较的;比得上的

comparator 英 ['kɒmpəreɪtə] 美 ['kɒmpəˌreɪtə]
n.比较仪,比较器;比测器;比长仪

介绍

  • Comparable可以认为是一个内比较器,很多类都会实现这个接口以提供对该类对象之间比较的默认实现;比如String,Integer,Float,Double类都实现了Comparable接口。(java.lang.Comparable)

  • Comparator可以认为是是一个外比较器,认为有两种情况可以使用实现Comparator接口的方式(java.util.Comparator):

    • 一个对象不支持自己和自己比较(没有实现Comparable接口),但是又想对两个对象进行比较;一般同类型对象比较很少实现这个接口。

    • 一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式。Comparator接口更多是实现这个功能。对特定比较需求提供支持。

源码

Comparable源码(JDK7)

package java.lang;
import java.util.*;

public interface Comparable<T> {
    public int compareTo(T o);
}

  • JDK源码的实现

  • java.util.Date类

public int compareTo(Date anotherDate) {
    long thisTime = getMillisOf(this);
    long anotherTime = getMillisOf(anotherDate);
    return (thisTime<anotherTime ? -1 : (thisTime==anotherTime ? 0 : 1));
}

static final long getMillisOf(Date date) {
    if (date.cdate == null || date.cdate.isNormalized()) {
        return date.fastTime;
    }
    BaseCalendar.Date d = (BaseCalendar.Date) date.cdate.clone();
    return gcal.getTime(d);
}
  • java.lang.Float类
public int compareTo(Float anotherFloat) {
    return Float.compare(value, anotherFloat.value);
}

public static int compare(float f1, float f2) {
    if (f1 < f2)
        return -1;           // Neither val is NaN, thisVal is smaller
    if (f1 > f2)
        return 1;            // Neither val is NaN, thisVal is larger

    // Cannot use floatToRawIntBits because of possibility of NaNs.
    int thisBits    = Float.floatToIntBits(f1);
    int anotherBits = Float.floatToIntBits(f2);

    return (thisBits == anotherBits ?  0 : // Values are equal
            (thisBits < anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)
             1));                          // (0.0, -0.0) or (NaN, !NaN)
}
  • java.lang.Integer类
public int compareTo(Integer anotherInteger) {
    return compare(this.value, anotherInteger.value);
}

public static int compare(int x, int y) {
    return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
  • 测试代码
public static void main(String[] args) {
	Integer i = new Integer(10);
	Integer j = new Integer(12);
	
	int result = i.compareTo(j);
	System.out.println("result="+result);
}

当然,我们可以实现Comparable接口,自定义排序规则,可以对单个字段或多个字段进行排序。

  • 集合排序,直接调用java.util.Collections.sort(list)来排序集合

  • 数组排序,直接调用java.util.Arrays.sort()来排序对象数组。

Comparator源码(JDK7)

package java.util;
public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
}

总结:一般需要自己写实现类来实现Comparable接口和Comparator接口,以实现自定义规则的比较排序。

有何区别

  1. Comparable是在集合内部定义的方法实现的排序,位于java.util下。Comparator是在集合外部实现的排序,位于java.lang下。

  2. Comparable支持自比较,自比较是指比如String等类里面本身就有CompareTo()方法,直接就可以进行String类对象的比较

  3. 运用Arrays.sort()方法时,注意二者的参数不同。Comparable的是java.util.Arrays.sort(stu);Comparator的是java.util.Arrays.sort(stu,new StudentComparator());

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值