Comparable和Comparator的用法和区别

这篇具有很好参考价值的文章主要介绍了Comparable和Comparator的用法和区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章目录

前言

一 .Comparable

1.Comparable是什么?

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

没学compar之前的解决办法 :

 2.在学习了comparable之后

二.comparator

1.comparator是什么?

2.comparator怎么用?

3.两者的差异

总结


前言

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

Comparable和Comparator的用法和区别


一 .Comparable

1.Comparable是什么?

public interface Comparable<T>

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

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

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

Comparable和Comparator的用法和区别

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

基础代码

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之前的解决办法 :

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

Comparable和Comparator的用法和区别

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

很简单的....

行吧好人做到底

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

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

Comparable和Comparator的用法和区别

 结果Comparable和Comparator的用法和区别

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

Comparable和Comparator的用法和区别

2.在学习了comparable之后

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

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

Comparable和Comparator的用法和区别

compareTo方法

Comparable和Comparator的用法和区别

 Comparable和Comparator的用法和区别

 代码

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是什么?

官方解释

Comparable和Comparator的用法和区别

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

2.comparator怎么用?

废话不多说了,直接上图

Comparable和Comparator的用法和区别

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

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

Comparable和Comparator的用法和区别

 Comparable和Comparator的用法和区别

 Comparable和Comparator的用法和区别

 优化方法体

Comparable和Comparator的用法和区别

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

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

Comparable和Comparator的用法和区别

3.两者的差异

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

Comparable和Comparator的用法和区别

Comparable和Comparator的用法和区别

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


总结

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

Comparable和Comparator的用法和区别文章来源地址https://www.toymoban.com/news/detail-454263.html

到了这里,关于Comparable和Comparator的用法和区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《Git入门实践教程》前言+目录

    版本控制系统(VCS)在项目开发中异常重要,但和在校大学生的交流中知道,这个重要方向并未受到重视。具备这一技能,既是项目开发能力的体现,也可为各种面试加码。在学习体验后知道,Git多样化平台、多种操作方式、丰富的资源为业内人士提供了方便的同时,也造成

    2024年02月10日
    浏览(50)
  • FPGA学习实践之旅——前言及目录

    很早就有在博客中记录技术细节,分享一些自己体会的想法,拖着拖着也就到了现在。毕业至今已经半年有余,随着项目越来越深入,感觉可以慢慢进行总结工作了。趁着2024伊始,就先开个头吧,这篇博客暂时作为汇总篇,记录在这几个月以及之后从FPGA初学者到也算有一定

    2024年02月03日
    浏览(35)
  • FlinkCDC 菜鸟教程-文章目录

    背景篇 环境篇  准备一台已经安装了 Docker 的 Linux 或者 MacOS 电脑。 准备教程所需要的组件 版本对应关系 安装 环境检查 工具篇 flink kibana 概念篇 Docker 介 绍 Docker Compose 介 绍 Kibana介 绍 实践篇 演示: Mysql CDC 导入 Elasticsearch 启动服务 准备数据 在 Flink SQL CLI 中使用 Flink DDL 创建

    2024年02月09日
    浏览(36)
  • Linux 学习目录合集【文章索引】

    前言:本内容为笔者自学笔记内容。 本文中的操作环境:腾讯云服务器:CentOS 7.6 64bit 学习阶段规划: Linux 基本操作【基本命令、vim、makefile使用等】 Linux 系统【进程:概念、控制、通信;IO基础;多线程等】 Linux 网络【网络基础、套接字编程、IO高级等】 学习集: C++ 入门

    2024年02月07日
    浏览(38)
  • 【数据结构】【王道】【数据结构实现】文章目录

    持续更新中。。。 数据结构 链接 顺序表实现及基本操作(可直接运行) 文章链接 无头结点单链表的实现及基本操作(可直接运行) 文章链接 带头结点单链表的实现及基本操作(可直接运行) 文章链接 双链表的实现及基本操作(可直接运行) 文章链接 循环链表的实现及

    2023年04月08日
    浏览(79)
  • vscode 系列文章目录 - ctrl+鼠标左键无效

    vscode 中有时会遇到 “Alt + 鼠标点击” 有效,但 “Ctrl + 鼠标点击” 无效,这时可以通过 Ctrl + , 进行系统配置。 进入VScode的首选项,选择设置(快捷键 Ctrl + , ),输入Go to definition,找到如下两个设置。 Editor: Multi Cursor Modifier 设置成 alt “editor.gotoLocation.multipleDefinitions” 设置

    2024年04月23日
    浏览(41)
  • 【vim 学习系列文章 5 - cscope 过滤掉某些目录】

    上篇文章:【vim 学习系列文章 4 - vim与系统剪切板之间的交互】 下篇文章:【vim 学习系列文章 6 – vim 如何从上次退出的位置打开文件】 第一步 创建自己的 cscope 脚本 ~/.local/bin/cscope.sh ,如下: 我的这个脚本首先去区分当前执行 cscope 命令的目录是 rt-thread 目录还是 linux 目

    2024年02月12日
    浏览(73)
  • 一篇文章带你了解SpringBoot目录结构

    前言 SpringBoot是整合Spring技术栈的一站式框架,是简化Spring技术栈的快速开发脚手架,是一个能够快速构建生产级别的Spring应用的工具。SpringBoot是目前流行的微服务框架,倡导“约定优于配置”,简化Spring项目搭建及开发过程。springboot提供了很多核心的功能,比如自动化配置

    2024年03月25日
    浏览(54)
  • Git系列文章目录 - Git 子模块git submodule使用

    项目中有时会遇到会涉及子模块的使用,比如 flatpak 项目包含多个子模块。 进入需要添加子模块的目录,一般是项目根目录。 删除子模块目录及源码: 删除项目目录下.gitmodules文件中子模块相关条目: 删除配置项中子模块相关条目: 删除模块下的子模块目录: 清除子模块

    2024年01月20日
    浏览(42)
  • 目录(文章更新中...)《实战NFT web3 solidity(新版本0.8.+)》

    注:由于是付费专栏内容,若有错误请及时联系@1_bit,博客链接:https://blog.csdn.net/A757291228 ,或在文章下留言,收到后将会对错误进行改正,若是版本更新导致的问题也希望大家对错误进行提交,尽力去保证付费用户该得到的权益。 友情提示:本系列文章读者最好学过一门编

    2024年02月16日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包