jvm学习——关于接口Comparable——丑九怪

jvm学习——关于接口Comparable的使用——丑九怪

官方解释

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方法中体现了排序的具体过程和排序的原则。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值