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接口相关的,但具体的情况,目前个人能力原因,无法继续深入,所以本问题,依旧存在,但是现阶段目前不会继续深究。
浙公网安备 33010602011771号