Comparable接口

60 阅读1分钟

Comparable接口:

定义比较的规则,实现该接口的类,其对象可以进行比较(如排序,比较大小);

位于java.lang包,无需引入,可以直接使用;核心方法:int Compare(T o),返回值决定结果;

事实上,Java中排序算法的底层实现也依赖Comparable接口。

CompareTo方法规则,返回值含义:

  • 正数,当前对象(this)大于目标对象(o);
  • 0, 当前对象(this)等于目标对象(o);
  • 负数,当前对象小于(this)目标对象(o);
compareTo(Student o) {
  return this.num - o.num;
}

image.png

使用步骤

  1. 类实现Comparable接口,指定泛型类型(通常为当前类);

  2. 重写compareTo方法,定义具体比较规则

  3. 直接使用比较逻辑(如排序、比较)

    • 配合Arrays.sort():实现对象数组的自动排序
    • 直接调用对象.compareTo(另一个对象)比较大小

实例演示(Student 类按学号排序

  1. 定义实现类
  public class Student implements Comparable<Student> {
        private int id; // 学号
        private String name;

        // 构造方法、getter/setter省略

        // 重写compareTo:按学号升序排序
        @Override
        public int compareTo(Student o) {
            return this.id - o.id; // 若返回o.id - this.id,则为降序
        }
    }

2. 使用排序

Student[] students = {
    new Student(3, "张三"),
    new Student(1, "李四"),
    new Student(2, "王五")
};
Arrays.sort(students); // 自动按学号升序排序
// 排序后结果:id=1(李四)、id=2(王五)、id=3(张三)

特点和注意事项

  • 自然排序唯一性:一个类只能实现一次Comparable,即只有一种自然排序规则
  • Comparator的区别:Comparable是类自身实现的排序(内部比较器),Comparator是外部定义的排序规则(灵活但需额外定义)
  • 空值处理:若比较中可能出现null,需在compareTo中添加非空判断(避免NullPointerException