为什么Comparable接口作为接口可实现对象排序?compareTo运行逻辑是什么?
核心疑问解答
你混淆了「接口定义的抽象方法」和「实现类重写后的方法」:Comparable 接口里的 compareTo() 确实是没有方法体的抽象方法,但你贴的 Student 类已经显式实现了 Comparable<Student> 接口,并且重写了 compareTo() 方法提供了具体的比较逻辑,调用时走的是你自己写的实现逻辑,自然能返回int值用来判断排序规则。
1. Java底层对compareTo()的处理逻辑
Java内置排序工具(Arrays.sort()、Collections.sort())针对实现了Comparable接口的类,会默认调用重写后的compareTo()判断两个元素的大小关系:
- JDK1.7之后,引用类型排序默认使用TimSort算法,算法执行过程中需要判断两个对象谁前谁后时,会把对象强转为
Comparable类型,直接调用你重写的compareTo()方法:- 返回负整数:当前对象小于待比较对象
- 返回0:两个对象相等
- 返回正整数:当前对象大于待比较对象
- 算法完全根据这个返回值决定两个元素的排序位置。
你提供的示例代码里compareTo()逻辑是年龄越小返回正整数,最终排序结果会按照年龄从大到小倒序排列。
class Student implements Comparable<Student> { int rollno; String name; int age; Student(int rollno, String name, int age) { this.rollno = rollno; this.name = name; this.age = age; } public int compareTo(Student st) { if (age == st.age) return 0; else if (age < st.age) return 1; else return -1; } }
2. 排序过程的相关函数调用逻辑
排序过程会调用多个JDK内置工具函数,以Collections.sort(List<Student> studentList)为例,完整调用链路是:
- 调用
Collections.sort()方法,内部先校验列表的可修改性,再把列表所有元素转成Object数组 - 调用
Arrays.sort()方法处理转换后的数组 Arrays.sort()内部执行TimSort排序逻辑,迭代数组的过程中需要比较两个元素a、b的大小时,执行((Comparable)a).compareTo(b)拿到返回值,决定两个元素的位置- 数组排序完成后,把排序后的元素逐个写回原来的List集合
如果你使用的是带Comparator参数的sort重载方法,就不会调用compareTo(),转而调用Comparator的compare()方法做比较。
内容的提问来源于stack exchange,提问作者Tu Le Anh
相关产品推荐
相关产品推荐

