java对象的比较

2023-10-31

上一章中关于PriorityQueue的使用要注意:

1. PriorityQueue中放置的元素必须要能够比较大小,不能插入无法比较大小的对象,否则会抛出
ClassCastException异常
2. 不能插入null对象,否则会抛出NullPointerException
3. 没有容量限制,可以插入任意多个元素,其内部可以自动扩容
4. 插入和删除元素的时间复杂度为
5. PriorityQueue底层使用了堆数据结构
6. PriorityQueue默认情况下是小堆---即每次获取到的元素都是最小的元素

优先级队列在插入元素时有个要求:插入的元素不能是null或者元素之间必须要能够进行比较,比如Integer,那优先级队列中能否插入自定义类型对象呢?

这里就会涉及到元素之间的比较。

1. 元素比较

对于元素,我们分为两大类,一类为基本数据类型,另一类为引用类型。

基本数据类型很好比较,整型,浮点型,布尔型都可以比较其大小。

那么引用类型如何比较呢?

比如两个人,两栋楼?

例如:

我们创建一个扑克牌类:

class Card {
    public int rank; // 数值
    public String suit; // 花色
    public Card(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }
}

从编译结果可以看出,Java中引用类型的变量不能直接按照 > 或者 < 方式进行比较。 那为什么==可以比较?
因为:对于用户实现自定义类型,都默认继承自Object类,而Object类中提供了equal方法,而==默认情况下调用的就是equal方法,但是该方法的比较规则是:没有比较引用变量引用对象的内容,而是直接比较引用变量的地址,但有些情况下该种比较就不符合题意。

Object中equal的实现,可以看到:直接比较的是两个引用变量的地址: 

2. 对象的比较

有些情况下,需要比较的是对象中的内容,比如:向优先级队列中插入某个对象时,需要对按照对象中内容来调整堆,那该如何处理呢?

我们一共有三种方法来实现:重写equals()方法 、 Comparble接口 、 比较器

2.1 重写equals

这是最好理解的一种比较方法。

例如:

注意基本类型可以直接比较,但引用类型最好调用其equal方法。 

虽然重写equals方法很好用,但是却有个致命缺陷,它只能比较是否相等,但是却不能比较大小。

2.2 Comparble接口类的比较

Comparble是JDK提供的泛型的比较接口类,源码实现具体如下:

Comparable接口中只提供了compareTo方法, 

返回值如下图: 

我们还是以上面的扑克为例:

来看看实际效果:

2.3 比较器 

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

Comparator 的定义:

Comparator 接口仅仅只包括两个函数,它的定义如下:

int compare(T o1, T o2);

boolean equals(Object obj);

 说明:
若一个类要实现Comparator接口:它一定要实现compareTo(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。
为什么可以不实现 equals(Object obj) 函数呢? 因为任何类,默认都是已经实现了equals(Object obj)的。 Java中的一切类都是继承于java.lang.Object,在Object.java中实现了equals(Object obj)函数;所以,其它所有的类也相当于都实现了该函数。
int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。

我们来依旧使用上面的例子:

 结构如下:

三种方式的比较:

覆写的方法 说明
Object.equals 因为所有类都是继承自 Object 的,所以直接覆写即可,不过只能比较相等与
Comparable.compareTo 需要手动实现接口,侵入性比较强,但一旦实现,每次用该类都有顺序,属于
内部顺序
Comparator.compare 需要实现一个比较器对象,对待比较类的侵入性弱,但对算法代码实现侵入性

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java对象的比较 的相关文章

随机推荐

  • win10禁用windows更新

    Windows 10系统中有一项Update Orchestrator Service 更新协调器办事 在当地办事窗口中 我们发现 Update Orchestrator Service 状态的启动类型为灰色 无法进行点击修改 2 禁用Wi
  • ESB产品Oracle数据库升级说明

    ESB企业服务总线平台作为支撑企业综合集成的产品 在应用集成 数据集成 数据治理等解决方案都发挥着非常重要的作用 随着产品和解决方案的不断优化和升级 ESB企业服务总线平台功能需要逐步进行完善 不断提升产品功能的完备性 易用性和全面性 为了
  • 类和对象

    面向对象 类和对象 数据存储方面 变量 只能存储一个 如果内容多了 存储起来需要定义n个变量 麻烦 数组 可以存储一组相同数据类型的数据 数据类型相同 如果用数组存储一个人的信息 比较丰富的信息的话 不太方便 例如 吃货联盟中存储订单和菜品
  • Flowable-ui-modeler和MybatisPlus冲突问题

    启动出现报错 file F code test flowable boot target classes com example flowableboot flowable mapper ProcessModelMapper class r
  • 目录功能详解

    bin usr bin usr local bin 是Binary的缩写 这个目录存放着最经常使用的命令 sbin usr sbin usr local sbin s就是Super User的意思 这里存放的是系统管理员使用的系统管理程序
  • SpringBoot配置多个Redis集群数据源+自定义缓存注解实例

    今天找了半天没找到线程的 网上都是多个Redis示例 最还还是自己想办法实现了 两个Redis集群作为数据源 自定义缓存注解 不会做的是否发现好tm难 都不知道怎么动手 做完之后 发现原理其实特别简单 很容易就能实现 分两部分原理和示例代码
  • 使用pycharm传入初始化环境配置参数(Run configuration)

    在run gt edit configurations 选择项目并填写参数
  • td 字典表_字典表设计

    为什么字典表 存在问题 某些变量在多个地方使用 而且一般是固定的 但是随着系统升级和后期变化 可能需要改变 如果这些变量写死在代码里面将会变得难以维护 所以要将其从代码中抽离出来 一般的业务系统客户端与用户交互的时候都会使用下拉框组件 对于
  • day2作业

    1 列举出3种常见的操作系统 答 操作系统 windows ubuntu MacOS 其内核 windowsNT Linux uniux 2 简述Ubuntu和Linux的关系 答 Ubuntu 乌班图 是一个以桌面应用为主的Linux操作
  • 数据结构C语言版——初始化一个线性表

    问题描述 初始化一个线性表 程序代码 include stdio h include stdlib h define OVERFLOW 0 define OK 1 define LIST INIT SIZE 100 define LISTI
  • bomblab实验-bomb1~6and隐藏关

    bomb1 08048ae0
  • Spring之Bean的生命周期

    文章目录 BeanFactory 中 Bean的生命周期 测试代码 结论 ApplicationContext中 Bean的生命周期 BeanFactory 中 Bean的生命周期 带 的表示为容需要实现的接口 不带星号的表示是bean要实
  • Python 第10章课后习题参考答案

    第10章课后习题参考答案 一 单项选择题 以下关于Python内置库 标准库和第三方库的描述 正确的是 A 第三方库需要单独安装才能使用 B 内置库里的函数不需要 import 就可以调用 C 第三方库有三种安装方式 最常用的是 pip 工
  • 【IntellJ IDEA】idea上所有代码都报错了

    可能会碰到蓝屏 内存溢出重启idea等特殊情况 重新打开idea后发现原本的代码全都报错了 正确的解决方法 方法很简单 执行idea工具栏上下面的菜单 File gt Invalidate Caches Restart 重置下缓存就可解决该
  • Samba服务的介绍,安装和使用

    一 samba概述 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件 由服务器及客户端程序构成 SMB Server Messages Block 信息服务块 是一种在局域网上共享文件和打印机的一种通信协议 SMB协议是
  • (二)Qt实现自定义控件的两种方式---插件法

    系列文章目录 一 Qt实现自定义控件的两种方式 提升法 二 Qt实现自定义控件的两种方式 插件法 文章目录 系列文章目录 前言 一 Qt自定义控件的制作 完整代码 二 QtCreator使用DLL文件 问题解决 总结 前言 上一篇文章提到了
  • Cordic角度旋转算法高位宽输入实现DDS的一些思考

    Cordic角度旋转算法简介 在DDS内 Cordic算法相当于替代Rom的一种相幅映射算法 算法通过计算单位圆上点的X坐标和Y坐标 得到角度 的正弦和余弦值 从一个正弦和余弦已知的初始角度开始 通过多次旋转一系列固定角度来获得所需点的坐标
  • 计算机视觉论文精度大纲

    念念不忘 必有回响 目录 一 图像分类 1 AlexNet 2 VGGNet 3 GoogleNet v1 4 GoogleNet v2 B 5 GoogleNet v3 6 ResNet 二 目标检测 1 YOLOv1 2 YOLOv2
  • paramType

    paramType paramType 表示参数放在哪个地方 header gt 请求参数的获取 RequestHeader 代码中接收注解 query gt 请求参数的获取 RequestParam 代码中接收注解 path 用于rest
  • java对象的比较

    上一章中关于PriorityQueue的使用要注意 1 PriorityQueue中放置的元素必须要能够比较大小 不能插入无法比较大小的对象 否则会抛出 ClassCastException异常 2 不能插入null对象 否则会抛出Null