Java中对象的比较:复写基类的equals+Comparble接口类的比较+比较器比较+PriorityQueue的比较+源码分析

news2024/12/27 13:48:33

文章目录

  • Java中对象的比较
    • 一、元素的比较
    • 二、对象的比较
      • 1.复写基类的equals
      • 2.基于Comparble接口类的比较
      • 3.基于比较器比较
        • 三种方法的对比
      • 4. 集合框架中PriorityQueue的比较方式


Java中对象的比较


一、元素的比较

在Java中,基本类型的对象可以直接比较大小。

二、对象的比较

1.复写基类的equals

Java中引用类型的变量不能直接按照 > 或者 < 方式进行比较

  • equals来比较相不相同
  • 用接口来实现 大于、小于的比较
    public static void main(String[] args) {
        Student student1 = new Student(13,"小明");
        Student student2 = new Student(13,"小明");
        System.out.println(student1==student2);//false
        System.out.println(student1.equals(student2));//false
    }

1.== 比较的是两个对象的地址值,所以不同

2.equals是student调用的,暂时没有重写equals方法,调用的是默认继承的falseObject的equals方法,底层还是==

    public boolean equals(Object obj) {
        return (this == obj);
    }

3.要在student类中重写equals方法

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

 System.out.println(student1.equals(student2));//true
 再次调用重写的equals方法,结果为true

2.基于Comparble接口类的比较

实现Comparble接口,在类中重写compareTo方法

class Student implements Comparable<Student> {
	    @Override
    public int compareTo(Student o) {
        return this.age-o.age;
    }

}

1.通过差值返回的正负数,来比较大小

  • Compareble是java.lang中的接口类,可以直接使用

3.基于比较器比较

  • 用户自定义比较器类,实现Comparator接口
class NameComparator implements Comparator<Student>{
    //比较器
    @Override
    public int compare(Student o1, Student o2) {
        return o1.name.compareTo(o2.name);
    }
}
class AgeComparator implements Comparator<Student>{
    //比较器
    @Override
    public int compare(Student o1, Student o2) {
        return o1.age-o2.age;
    }
}
public int compareTo(String anotherString) {
        int len1 = value.length;
        int len2 = anotherString.value.length;
        int lim = Math.min(len1, len2);
        char v1[] = value;
        char v2[] = anotherString.value;

        int k = 0;
        while (k < lim) {
            char c1 = v1[k];
            char c2 = v2[k];
            if (c1 != c2) {
                return c1 - c2;
            }
            k++;
        }
        return len1 - len2;
    }
  • 因为name是String类型,所以调用的是String自己重写的compareTo方法进行比较
        NameComparator nameComparator = new NameComparator();
        int ret = nameComparator.compare(student1,student2);
        System.out.println(ret);
        
        AgeComparator ageComparator = new AgeComparator();
        int ret2 = ageComparator.compare(student1, student2);
        System.out.println(ret2);
  • 使用比较器时要先进行创建
  • 比较器比重写重写compareTo方法要更加灵活
  • Comparator是java.util 包中的泛型接口类,使用时必须导入对应的包
三种方法的对比
复写的方法说明
Object.equals直接覆写,只能比较是否相等
Comparable.compareTo手动实现接口,侵入性比较强,一旦实现,每次用该类都有顺序
Comparator.compare需要实现一个比较器对象,对待比较类的侵入性弱,但对算法代码实现侵入性

4. 集合框架中PriorityQueue的比较方式

集合框架中的PriorityQueue底层使用堆结构,因此其内部的元素必须要能够比大小
在这里插入图片描述

PriorityQueue采用了:Comparble和Comparator两种方式

  • 1.Comparble是默认的内部比较方式,如果用户插入自定义类型对象时,该类对象必须要实现Comparble接

    口,并覆写compareTo方法

  • 2.用户也可以选择使用比较器对象,如果用户插入自定义类型对象时,必须要提供一个比较器类,让该类实现

    Comparator接口并覆写compare方法。

    public static void main(String[] args) {
        Student student1 = new Student(13,"小明");
        Student student2 = new Student(14,"小明");
        AgeComparator ageComparator = new AgeComparator();
        Queue<Student> priorityQueue = new PriorityQueue<>(ageComparator);
        priorityQueue.offer(student1);
        priorityQueue.offer(student2);
class AgeComparator implements Comparator<Student>{
    //比较器
    @Override
    public int compare(Student o1, Student o2) {
        //return o1.age-o2.age;
        return o2.age-o1.age;
        //return o2.compareTo(o1);
    }
}
  • 传一个比较器
        Queue<Student> priorityQueue = new PriorityQueue<>(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
               return o2.age - o1.age;
            }
        });//匿名内部类

匿名类的写法,等价于上面

        Queue<Student> priorityQueue = new PriorityQueue<>((o1, o2) -> {return o2.compareTo(o1);});
        //lambda表达式写法

lambda表达式写法

点击移步博客主页,欢迎光临~

偷cyk的图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1183434.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

哪款手机便签软件支持存储录音文件并支持转文字?

手机便签类软件带有存储录音转文字功能是比较实用的&#xff0c;很多人通常会整理很多录音类型的文件&#xff0c;录音文件整合在一起后&#xff0c;后续有需要可以逐条点开播放收听。尤其是在工作中&#xff0c;当领导说一些重点时&#xff0c;大家无法借助灵活的大脑来成功的…

第20章_Myisam与InnoDB

文章目录 区别如何选择innodb额外补充知识innodb为什么推荐使用自增ID作为主键innodb引擎4大特性 区别 InnoDB支持事务&#xff0c;MyISAM不支持&#xff0c;对于InnoDB每一条SQL语言都默认封装成事务&#xff0c;自动提交&#xff0c;这样会影响速度&#xff0c;所以最好把多条…

编写MBR主引导记录

BIOS 检测&#xff0c;初始化硬件。挑一些重要的&#xff0c;能保证计算机能运行那些硬件的基本IO操作。 唤醒BIOS 唤醒BIOS需要知道其入口地址&#xff0c;在最后将跳转到0x7c00处 接电的一瞬间&#xff0c;cs:ip寄存器被初始化为0xF000:0xFFF0&#xff0c;所以等效地址是0…

Mybatis-Plus前后端分离多表联查模糊查询分页

数据准备 数据库配置: /*Navicat Premium Data TransferSource Server : localhost_3306Source Server Type : MySQLSource Server Version : 80100 (8.1.0)Source Host : localhost:3306Source Schema : test01Target Server Type : MySQLT…

Ubuntu20.0工作区(workspace)介绍,切换工作区方式和快捷键

Ubuntu20.0工作区&#xff08;workspace&#xff09;介绍&#xff0c;切换工作区方式和快捷键 先修改一下ubuntu截屏的快捷键查看工作区新建工作区工作区切换 先修改一下ubuntu截屏的快捷键 修改为 查看工作区 按下Super键&#xff08;即Windows键&#xff09;&#xff0c;可…

sql学习笔记(三)

目录 1.四舍五入 2.向上取整 3.向下取整 4.Hive 分区 5.case when条件语句 6.日期函数 7.字符串函数 8.窗口函数 1️⃣排序函数 1.四舍五入 round select round(3.14) —>3 2.向上取整 ceiling select ceiling(12.15) —>13 3.向下取整 floor select flo…

【网络协议】

网络协议 1 网络通讯1.1 防火墙1.2 子网掩码1.3 网关1.4 2 SSH2.1 SSH2.2 SSH12.3 SSH2 3 Telnet4 Telnet/SSL5 NFS6 TFTP7 FTP8 SFTP9 HTTP10 HTTPS11 NAT12 加密 1 网络通讯 1.1 防火墙 所谓“防火墙”&#xff0c;是指一种将内部网和公众访问网(如Internet)分开的方法&…

spring中纯注解实现Advice

背景&#xff1a;课本上是注解和Xml文件混用的方式&#xff0c;研究了一下用配置类加注解和测试方法实现各种通知方式的切入。 1.首先dao的接口&#xff0c;增删改查 public interface UserDaoAspect {public void add();public void delete();public void update();public vo…

【K-means聚类算法】实现鸢尾花聚类

文章目录 前言一、数据集介绍二、使用步骤1.导包1.2加载数据集1.3绘制二维数据分布图1.4实例化K-means类&#xff0c;并且定义训练函数1.5训练1.6可视化展示2.聚类算法2.1.可视化生成3其他聚类算法进行鸢尾花分类 前言 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器…

Vue 3 相对于 Vue2,模板和组件的一些变化

目录 1&#xff0c;模板的变化1&#xff0c;v-modelvue2vue3 2&#xff0c;v-if 和 v-for3&#xff0c;keyv-forv-if 4&#xff0c;Fragment 2&#xff0c;组件的变化1&#xff0c;Teleport2&#xff0c;异步组件 1&#xff0c;模板的变化 1&#xff0c;v-model vue2 对组件…

c语言初学者用vs还是vscode?

c语言初学者用vs还是vscode? 看是科班还是自学&#xff0c;一般学校会有要求的编译软件&#xff0c;在这两者之间&#xff0c;用VS的居多&#xff0c;一个可能的原因是VS不用自己装环境。 最近很多小伙伴找我&#xff0c;说想要一些 c语言的资料&#xff0c;然后我根据自己从…

Rust核心功能之一(所有权)

目录 1、什么是所有权&#xff1f; 1.1 所有权规则 1.2 变量作用域 1.3 String 类型 1.4 内存与分配 变量与数据交互的方式&#xff08;一&#xff09;&#xff1a;移动 变量与数据交互的方式&#xff08;二&#xff09;&#xff1a;克隆 只在栈上的数据&#xff1a;拷贝…

【C++20】模块

模块 C语言从一开始便继承了C语言的include头文件机制&#xff0c;通过包含头文件的方式来引用其他组件的代码&#xff0c;这些头文件通常包含了该组件相关的接口声明。但使用头文件通常伴有如下问题&#xff1a; 不够清晰不够清晰同名符号覆盖问题 C20提供了模块特性&#…

本地生活新赛道-视频号团购怎么做?

目前有在做实体行业的商家一定要看完&#xff0c;只要你进入了这个本地生活新的赛道&#xff0c;那你的生意自然会源源不断&#xff0c;那这个赛道又是什么呢&#xff1f; 这就是十月份刚刚上线的视频号团购项目&#xff0c;开通团购之后&#xff0c;就可以通过发短视频&#…

排序:堆排序(未完待续)

文章目录 排序一、 排序的概念1.排序&#xff1a;2.稳定性&#xff1a;3.内部排序&#xff1a;4.外部排序&#xff1a; 二、插入排序1.直接插入排序 二、插入排序堆排序 排序 一、 排序的概念 1.排序&#xff1a; 一组数据按递增/递减排序 2.稳定性&#xff1a; 待排序的序列…

postman中文乱码

在header中添加这两个&#xff1a; Content-Type application/json;charsetUTF-8 Accept application/json;charsetUTF-8

『昆仑天工』4款AI产品开源!提供API对接!

在文章开篇&#xff0c;小圈先介绍下 昆仑万维 公司旗下的AI大模型**『天工』**&#xff0c;它是由昆仑万维自研的双千亿级大语言模型&#xff0c; 也是国内首个对标ChatGPT的双千亿级大语言模型&#xff0c;可满足文案创作、知识问答、代码编程、逻辑推演、数理推算等需求。 …

自制宏正(ATEN)KVM CS1708i固件升级线

因为宏正 CS1708i KVM年代相对久远&#xff0c;最近通过Web进行远程管理时发现页面不支持最新的EDGE浏览器&#xff0c;官方有较新的固件&#xff0c;但是需要专用的RJ11接头的升级串口线才能进行升级。网上目前无法买到&#xff0c;在网上找到对应的资料&#xff0c;用RJ11 4P…

ansible第一天

ansible 第一天 以上主机使用rhel-8.2-x86_64-dvd.iso镜像&#xff0c;配置ip、yum源&#xff0c;关闭防火墙和selinux规则 安装中文包&#xff0c;重启生效 [rootcontrol ~]# yum -y install langpacks-zh_CN.noarch && reboot 配置名称解析 [rootcontrol ~]# echo…

拓展企业客户群:如何使用企业联系方式查询API帮助在社交媒体上寻找潜在客户

前言 在当今竞争激烈的商业环境中&#xff0c;拓展企业客户群已经成为许多企业的首要任务之一。在这种情况下&#xff0c;使用企业联系方式查询API可以帮助企业在社交媒体上寻找潜在客户。本文将探讨如何使用企业联系方式查询API拓展企业客户群。 企业联系方式查询API简介 首…