equals()和hashCode()

news/2024/7/27 7:36:40/文章来源:https://blog.csdn.net/sinat_25380899/article/details/136661365

一、equals()

equals()方法用于比较两个对象是否相等

equals在object中的定义:

public boolean equals(Object ojb){return (this == ojb)
}

很明显对比的是像个对象的地址(即引用)是否相等

String 、Math、Integer、Double等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法,进行内容的比较。

当然,基本类型是进行值的比较。

性质:

  • 自反性:x.equals(x)一定是true
  • 对称性:x.equals(y)true时,y.equals(x)也是true
  • 传递性:如果x.equals(y)true,同时y.equals(z)true,那么x.equals(z)一定是true
  • 一致性:如果用于equals比较的对象信息没有被修改的话,多次调用时x.equals(y)要么一致地返回true要么一致地返回false
  • 对于任意不为null的引用值xx.equals(null)返回false

需要注意的是当equals()方法被override时,hashCode()也要被override。按照一般hashCode()方法的实现来说,相等的对象,它们的hash code一定相等。

二、hashCode()

对象调用hashCode()方法会返回一个hash Code值,相同的对象,返回相同的hash Code值,该方法被用于hashTables,例如HashMap。

性质:

  • 如果一个对象传递给equals作比较的信息没有被修改的话,多次调用hashCode()方法,返回的值始终唯一
  • 两个对象调用object.equals(obj)相等,那么这两个对象的hashCode()一定相等
  • 两个对象调用object.equals(obj)不相等,那么这两个对象的hashCode()不一定不相等(也就是说hashCode()相等,equals()不一定相等)

Java对象的eqauls方法和hashCode方法是这样规定的:

1、相等(相同)的对象必须具有相等的哈希码(或者散列码)。

2、如果两个对象的hashCode相同,它们并不一定相同。

三、Hashset、Hashmap、Hashtable与hashcode()和equals()的密切关系

Hashset是继承Set接口,Set接口又实现Collection接口,这是层次关系。

那么Hashset、Hashmap、Hashtable中的存储操作是根据什么原理来存取对象的呢?

        以HashSet为例进行分析,我们都知道:在hashset中不允许出现重复对象,元素的位置也是不确定的。在hashset中又是怎样判定元素是否重复的呢?

在java的集合中,判断两个对象是否相等的规则是:
         1.判断两个对象的hashCode是否相等

             如果不相等,认为两个对象也不相等,完毕
             如果相等,转入2
           (这一点只是为了提高存储效率而要求的,其实理论上没有也可以,但如果没有,实际使用时效率会大大降低,所以我们这里将其做为必需的。)

         2.判断两个对象用equals运算是否相等
            如果不相等,认为两个对象也不相等
            如果相等,认为两个对象相等(equals()是判断两个对象是否相等的关键)
            为什么是两条准则,难道用第一条不行吗?不行,因为前面已经说了,hashcode()相等时,equals()方法也可能不等,所以必须用第2条准则进行限制,才能保证加入的为非重复元素。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

发布一个npm包到 Nexus私有仓库

前文:使用nexus3搭建npm私有仓库 1、前置条件 git、 nvm、nrm、monorepo 的概念,以及 lerna 的使用、 yarn 的使用 基于 lerna yarn 的 monorepo 仓库 lerna npm i -g lernamac : zsh: command not found: lerna brew install lerna2、添加nexus权…

OpenHarmony教程—语言基础类库

介绍 本示例集合语言基础类库的各个子模块,展示了各个模块的基础功能,包含: ohos.buffer (Buffer)ohos.convertxml (xml转换JavaScript)ohos.process (获取进程相关的信息)ohos.taskpool (启动任务池)ohos.uri (URI字符串解析)ohos.url (UR…

还有没有免费裁剪音频的软件?15款音乐裁剪软件测评!(不断更新)

市面上有哪些免费裁剪音频的软件呢?今天,我们就来为大家详细介绍15款热门的音乐裁剪软件,并对其进行深度测评。 裁剪音频软件测评1:金舟音频大师 好评指数:4.5/5 优点罗列:支持音频格式转换、裁剪、降噪、…

Unity的PICO项目基础环境搭建笔记(调试与构建应用篇)

文章目录 前言一、为设备开启开发者模式1、开启PICO VR一体机。前往设置>通用>关于本机>软件版本号2、一直点击 软件版本号 ,直到出现 开发者 选项3、进入 开发者模式,打开 USB调试,选择 文件传输 二、实时预览应用场景1、下载PC端的…

RabbitMQ - 04 - Fanout交换机 (广播)

目录 部署demo项目 什么是Fanout交换机 实现Fanout交换机 1.控制台 声明队列 声明交换机 将交换机与队列绑定 2.编写消费者方法 3.编写生产者测试方法 部署demo项目 通过消息队列demo项目进行练习 相关配置看此贴 http://t.csdnimg.cn/hPk2T 注意 生产者消费者的…

idea2023和历史版本的下载

1.idea中文官网 idea官网历史版本下载(https://www.jetbrains.com.cn/idea/download/other.html)

python基础——列表【创建,下标索引,常见操作方法】

📝前言: 这篇文章主要讲解一下python中常见的数据容器之一——列表 本文主要讲解列表的创建以及我们常用的列表操作方法 🎬个人简介:努力学习ing 📋个人专栏:C语言入门基础以及python入门基础 &#x1f380…

【Linux】Linux——Centos7安装

目录 虚拟机安装【空壳子】安装VMware Workstation新建虚拟机硬件兼容性(直接下一步)稍后安装操作系统客户及操作系统选择Linux,版本Centos764位给虚拟机命名,并选择安装位置处理器配置(默认即可,不够用后面可以调)虚拟…

OWASP Top 10 网络安全10大漏洞——A03:2021-注入

10大Web应用程序安全风险 2021年top10中有三个新类别、四个类别的命名和范围变化,以及一些合并。 A03:2021-注入 Injection从第一的位置滑落至第三位置。94% 的应用程序针对某种形式的注入进行了测试,最大发生率为 19%,平均发生率为 3%&a…

Verovio简介及在Windows10和Ubuntu 22.04上编译过程

Verovio是一个快速、便携、轻量级的开源库,用于将音乐编码倡议(Music Encoding Initiative(MEI))数字乐谱雕刻到SVG图像中。Verovio还包含即时转换器(on-the-fly converters)用于渲染Plaine & Easie Code、Humdrum、Musedata、MusicXML、EsAC和ABC数字乐谱。源代…

【HarmonyOS】鸿蒙开发之工具安装与工程项目简介——第1章

鸿蒙开发工具包下载与使用 鸿蒙开发工具包下载 下载deveco studio开发工具包 系统要求: Windows 操作系统:Windows 10/11 64 位 内存:8GB 及以上 硬盘:100GB 及以上 分辨率:1280*800 像素及以上macOS 操作系统:mac…

Git分支管理(Git分支的原理、创建、切换、合并、删除分支)

系列文章目录 文章一:Git基本操作 文章目录 系列文章目录前言一、Git分支是什么二、Git分支的原理三、创建分支四、切换分支五、合并分支六、删除分支 前言 在上一篇文章中,我们学习了如何使用Git的一些基本操作,例如安装Git、创建本地仓库…

[抽象]工厂模式([Abstract] Factory)——创建型模式

[抽象]工厂模式——创建型模式 什么是抽象工厂? 抽象工厂模式是一种创建型设计模式,让你能够保证在客户端程序中创建一系列有依赖的对象组时,无需关心这些对象的类型。 具体来说: 对象的创建与使用分离: 抽象工厂模…

PostgreSQL数据优化——死元组清理

最近遇到一个奇怪的问题,一个百万级的PostgreSQL表,只有3个索引。但是每次执行insert或update语句就要几百ms以上。经过查询发现是一个狠简单的问题,数据库表死元组太多了,需要手动清理。 在 PG 中,update/delete 语句…

2023年终总结——跌跌撞撞不断修正

目录 一、回顾1.一月,鼓足信心的开始2.二月,焦躁不安3.三月,路还是要一步一步的走4.四月,平平淡淡的前行5.五月,轰轰烈烈的前行6.六月,看事情更底层透彻了7.七月,设计模式升华月8.八月&#xff…

qt如何配置ros环境

在Qt5.7的版本可以使用bash -i -c来启动qt,让Qt自己识别系统环境,不知道为什么Qt在之后的版本,这样使用都失效了。因为它会默认把CMAKE_PREFIX_PATH修改掉。 网上还有安装ros插件版本的qt creator,感觉失去了一些灵活性。 自己测试…

STM32-WDG看门狗

目录 简介 独立看门狗 键寄存器 窗口看门狗 特点 简介 STM32内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障,当计数器达到给…

goctl-swagger 生成json接口文件

参考: GitHub - dyntrait/goctl-swagger: 通过 api 文件生成 swagger 文档 GitHub - Bluettipower/goctl-swagger 一:编译 执行go install 前一般需要设置环境,不然资源经常会下载不下载 go env -w GOPROXYhttps://goproxy.cn,direct 执行完 go in…

数据库管理-第159期 Oracle Vector DB AI-10(20240311)

数据库管理159期 2024-03-11 数据库管理-第159期 Oracle Vector DB & AI-10(20240311)1 其他distance函数2 实例演示使用其他函数寻找最近向量点函数变体简写语法 总结 数据库管理-第159期 Oracle Vector DB & AI-10(20240311&#x…

【软件测试基础篇】第一节.软件测试基础1

文章目录 前言⼀、了解软件测试行业二、主流测试技能三、测试常用分类四、模型 4.1 质量模型 4.2 w模型五、测试流程六、测试用例总结 前言 一、了解软件测试行业 1.概念: 使用技术手段验证软件功能是否符合需求 2.特点: 岗位缺口&#xff1a…