comparable和comparator接口的底层实现以及相关使用

comparable和comparator接口使用相关

comparable接口重写方法时需要注意double类型的不可以直接强转,如果两个值的差为零点几时,强转会直接等于零,导致最后返回结果为零,使得程序判断两个值相等,推荐写法如下:

class Student{
    int age;
    //小到大排序
    @Override
    public int compareTo(Object o){
    Student stu = (Student)o;
    //方式一
    if(this.age > stu.age){
        return 1;
    }else if(this.age < stu.age){
        return -1;
    }else{
        return 0;
    }
    //方式二
    return Double.compare(this.age, stu.age);
}
}

comparable和comparator接口底层相关

由于使用comparable和comparator接口都是做排序用,即对这两个接口实现并重写方法后用Arrays.sort()方法对需要排序的数组元素进行排序。

源码中关于Arrays.sort()是这样的

public static <T> void sort(T[] a, Comparator<? super T> c) {
 if (c == null) {
    sort(a);
    } else {
      if (LegacyMergeSort.userRequested)
         legacyMergeSort(a, c);
      else
         TimSort.sort(a, 0, a.length, c, null, 0, 0);
 }
}

明显看到此方法中有关于Comparator接口的使用,但是Comparable接口并未涉及,但是其实代码的最后一句中TimSort其实是和Comparable接口相关的,但具体的情况,目前个人能力原因,无法继续深入,所以本问题,依旧存在,但是现阶段目前不会继续深究。

posted @ 2021-04-19 14:01  瓜铺  阅读(172)  评论(0)    收藏  举报