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接口,以实现自定义规则的比较排序。
有何区别
-
Comparable是在集合内部定义的方法实现的排序,位于java.util下。Comparator是在集合外部实现的排序,位于java.lang下。
-
Comparable支持自比较,自比较是指比如String等类里面本身就有CompareTo()方法,直接就可以进行String类对象的比较
-
运用Arrays.sort()方法时,注意二者的参数不同。Comparable的是java.util.Arrays.sort(stu);Comparator的是java.util.Arrays.sort(stu,new StudentComparator());