Comparable和Comparator的用法和区别

文章目录

目录

文章目录

前言

一 .Comparable

1.Comparable是什么?

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

没学compar之前的解决办法 :

 2.在学习了comparable之后

二.comparator

1.comparator是什么?

扫描二维码关注公众号,回复: 15202821 查看本文章

2.comparator怎么用?

3.两者的差异

总结

前言

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


一 .Comparable

1.Comparable是什么?

public interface Comparable<T>

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

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

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

在这里先给大家一个应用场景: 设计一个Student类,定义成员变量name和age

定义一个测试类,要求按年龄大小打印出所有对象的所有信息,该怎么做呢?

宝子们不妨自己试一下再往下看,这里先给出类的部分代码

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

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

简洁吗?

我只能说一般!

在我们学习Stream和Lambda后,可以写出更加简介的代码,如果再加上方法引用,那就直接起飞!

想要了解更多,别忘了关注博主哦

真正的重点还是再Student类中的compareto方法

我们先来看一下jdk中的概述

 

 代码

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的学习吧!

二.comparator

1.comparator是什么?

官方解释

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

2.comparator怎么用?

废话不多说了,直接上图

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

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

 

 

 优化方法体

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

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

3.两者的差异

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

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


总结

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

猜你喜欢

转载自blog.csdn.net/weixin_73869209/article/details/130647804