谈谈对Comparable和Comparator的理解

文章介绍了Java中的TreeSet集合,它基于平衡二叉树实现,要求存储的数据有自然顺序或比较方式。文章详细讲解了Comparable接口和Comparator接口在排序中的作用。Comparable是排序接口,适用于类本身支持排序的情况;Comparator则是比较接口,用于控制没有实现Comparable接口的类的排序。通过示例代码展示了如何使用这两个接口对Teacher类的对象按年龄进行升序或降序排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们知道Set系列的集合的存储特点是元素无序,不重复,但是TreeSet基于平衡二叉树实现,底层存储数据有要求,分别是以下两点 存储数据有自然顺序。存储数据比较方式。这个比较方式就是我们今天所说的重点了,两个比较对象,下来咱们来看看他们的使用场景和区别

一:Comparable

这个类位于java.lang包中, Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。. 而Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。. Comparable相当于“内部比较器”,相当于给实体类本身添加排序功能

例如:常见一个实现Comparable接口的Teacher类,重写比较方法compare To,按照年龄升序

public class Teacher implements  Comparable<Teacher>{
    private Integer id;
    private String name;
    private  Integer age;
    public  Teacher () {

    }

    public Teacher(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Teacher o) {
        return age - o.age;
    }
}

创建测试类Demo1

public  class Demo1 {
    public static void main(String[] args) {
        Set<Teacher> list = new TreeSet<>();
        list.add(new Teacher(1,"王五",33));
        list.add(new Teacher(2,"张五",43));
        list.add(new Teacher(3,"里五",23));
        list.add(new Teacher(4,"肖五",3));
        System.out.println(list);
    }
}

执行结果如下

如图,我们可以看见,该类已经按照年龄降序了。说明我们重写的Compara To比较方法已经生效

二:Comparator

 Comparator是比较接口,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现Comparator来新建一个比较器,然后通过这个比较器对类进行排序。我们需要注意的是

  1. 若一个类要实现Comparator接口:它一定要实现compare(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。 2、int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。现在假如上面的Teacher类没有实现Comparable接口,该如何比较大小呢?我们可以新建一个类,让其实现Comparator接口,从而构造一个“比较器"。

//自定义比较器对象
public class Demo2 implements Comparator<Teacher> {
    @Override
    public int compare(Teacher o1, Teacher o2) {
        return o1.getAge()- o2.getAge();//返回
    }
 public static void main(String[] args) {
        Set<Teacher> teachers = new TreeSet<>();
         teachers.add(new Teacher(1,"张三",45));
         teachers.add(new Teacher(2,"李四",5));
         teachers.add(new Teacher(3,"王五",456));
         teachers.add(new Teacher(4,"赵六",65));
        System.out.println(teachers);
}
}

排序结果如下

我们可以看见,已经按照年龄升序了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值