Comparable和Comparator的用法和区别

文章目录

前言

一 .Comparable

1.Comparable是什么?

2.comparable有用吗? 有用的话它有什么用?

没学compar之前的解决办法 :

 2.在学习了comparable之后

二.comparator

1.comparator是什么?

2.comparator怎么用?

3.两者的差异

总结


前言

在这里给大家整理了一下comparable和comparator的用法和区别,这些在以后代码和面试中可能也会出现,那么,就跟着我一起去看看吧!


一 .Comparable

1.Comparable是什么?

public interface Comparable<T>

comparable是个接口,此接口强行对实现它的每个的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法

实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序

2.comparable有用吗? 有用的话它有什么用?

应用场景: 要求对学生按照年龄大小进行排序

基础代码

public class Student {
    String name;
    int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
public class Test {
    public static void main(String[] args) {
        // 年龄给出无序,避免对结果进行干扰
        Student s1 = new Student("兽宝一号",23);
        Student s2 = new Student("兽宝二号",10);
        Student s3 = new Student("兽宝三号",18);
        Student s4 = new Student("兽宝四号",35);
    }
}

没学compar之前的解决办法 :

遍历得到每个对象的年龄,存入整形数组,再进行排序

这里给出最后的排序和打印的代码,数组也是随便创的,大家有兴趣的话可以自己去遍历一下,

很简单的....

行吧好人做到底

下面只给图,不会给代码,有能力写的不需要代码,没能力的更需要多练!

如果你有集合的知识,遍历会更加简单,这里给出另一种方式,数组

 结果

 以上代码如果看不懂的话,建议看看博主其他的文章,打一下基础再来,上面的设计的知识点一言两语说不清楚,在此不会展开来进行详解,望宝子们见谅啊!实在是一锅炖不下啊!

2.在学习了comparable之后

实Comparable接口,重写抽象方法compareTo

先给大家看一下结果,别眨眼哦

compareTo方法

 

 代码

public class Student implements Comparable<Student>{
    String name;
    int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Student student) {
        return this.age - student.age;
    }
}
public class Test2 {
    public static void main(String[] args) {
        // 年龄给出无序
        Student s1 = new Student("兽宝一号",23);
        Student s2 = new Student("兽宝二号",10);
        Student s3 = new Student("兽宝三号",18);
        Student s4 = new Student("兽宝四号",35);

        // 这里用集合来讲,如果又不会的,直接用上面的代码也没问题
        ArrayList<Student> al = new ArrayList<>();

        //Collections 集合工具类 在这里调用了添加方法
        Collections.addAll(al,s1,s2,s3,s4);

        for (int i = 0; i < al.size(); i++) {
            Student stu = al.get(i);
            System.out.println("name = "+stu.name+" age = "+stu.age);
        }

    }
}

二. comparator

1.comparator是什么?

官方解释

 Comparator可以认为是是一个比较器,本质上和Comparable相同,都是用来比较的

2.comparator怎么用?

废话不多说了,直接上图

 第一种用到了匿名内部类,第二种比较简单,我们先挑软柿子捏!

由于第二种方法也需要实现接口,为了不和上面起冲突,我们就再定义一个Animal类吧

 

 

 优化方法体

下面我们来看看匿名内部类的方式调用compare

如果你对匿名内部类不熟练,那么请看博主前面的文章,相信会帮到你的

3.两者的差异

1、如果实现类没有实现Comparable接口,又想对两个类进行比较(或者实现类实现了Comparable接口,但是对compareTo方法内的比较算法不满意),那么可以实现Comparator接口,自定义一个比较器,写比较算法

2、实现Comparable接口的方式比实现Comparator接口的耦合性要强一些,如果要修改比较算法,要修改Comparable接口的实现类,而实现Comparator的类是在外部进行比较的,不需要对实现类有任何修改。从这个角度说,其实有些不太好,尤其在我们将实现类的.class文件打成一个.jar文件提供给开发者使用的时候。实际上实现Comparator接口的方式后面会写到就是一种典型的策略模式


总结

以上就是本篇讲的主要内容了,如果可以的话,大家尽量把代码敲一下,脑子会了不代表手会了

  • 56
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 81
    评论
评论 81
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢吃animal milk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值