官方解释
public interface Comparable<T> {
public int compareTo(T o);
}
- 此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法()
其实我不是很喜欢看官方解释,虽然严谨,细腻,但同时也晦涩难懂(其中部分内容,尤其是对于英文不咋地好的朋友很不友好)
我的理解
- 这个接口提供了一种比较或排序的手段。通过Arrays或Collection的sort方法对我们自己写的类对象进行比较或排序。我们要做的是让我们的类继承Comparable接口并实现compareTo方法,具体比较原则由我们实现的compareTo方法决定。相当于将比较的部分划分在了每个类中,而不是在比较时具体实现
实例演示
上代码
public class ComparableClass implements Comparable<ComparableClass> {
private long no = 0L;
public ComparableClass() {
}
public ComparableClass(long no) { // 传入参数,作为比较的数据
this.no = no;
}
@Override
public int compareTo(ComparableClass o) { // 这就是我实现的比较原则,
return (int) (o.no - this.no); // 当参数的no比自己的no小,返回负数,相等返回0
}
}
上面是我构建的试验类,测试时用它来产生对象
public static void main(String[] args) {
ComparableClass comparableClass[] = {
new ComparableClass(1), // 产生5个对象,其中的成员no都不一样
new ComparableClass(3),
new ComparableClass(5),
new ComparableClass(2),
new ComparableClass(9)
};
Arrays.sort(comparableClass); // 调用方法进行比较
for (int index = 0; index < comparableClass.length; index++) { // 循环输出结果
System.out.println(comparableClass[index].no);
}
}
上面测试类运行结果如下图,很明显,这个对象数组被排列了,当然是按按照我们所规定的原则进行的比较和排列
如果想了解其中的实现过程,下面解释一下
实现原理
这是Arrays.sort的源码,其中else之后,我们点开来看
public static void sort(Object[] a) {
if (LegacyMergeSort.userRequested)
legacyMergeSort(a);
else
ComparableTimSort.sort(a, 0, a.length, null, 0, 0);
}
上面第5行,ComparableTimSort.sort方法中调用了此类中一个关键的方法binarySort,如下面的代码所示
static void sort(Object[] a, int lo, int hi, Object[] work, int workBase, int workLen) {
......
if (nRemaining < MIN_MERGE) {
int initRunLen = countRunAndMakeAscending(a, lo, hi);
binarySort(a, lo, hi, lo + initRunLen); // 这个方法是关键方法
return;
}
......
}
我们进入binarySort方法中查看一番
private static void binarySort(Object[] a, int lo, int hi, int start) {
......
for ( ; start < hi; start++) {
Comparable pivot = (Comparable) a[start]; // 关键1
......
if (pivot.compareTo(a[mid]) < 0) //关键2
right = mid;
else
left = mid + 1;
......
}
这中间我省略了大部分代码,想让读者看到关键部分,关键1的那一行:将传进来的Object[]中的参数类型转换为Comparable接口类型,关键2的那一行:比较原则是对象所实现的compareTo方法
- 总结一下:用Arrays.sort方法对实现了Comparable接口的类对象进行排序,sort方法中调用了ComparableTimSort中的sort方法,ComparableTimSort的sort方法调用了本类中的binarySort方法,在binarySort方法中体现了排序的具体过程和排序的原则。