Java中 HashSet如何判断两个对象是否相等

HashSet如何判断两个对象是否相等

HashSet 是 Java 中的一个类,它实现了 Set 接口。HashSet 中的元素是无序且唯一的,它不保证元素的顺序,也不允许出现重复元素。为了确定两个对象是否相等,HashSet 使用了以下两个方法:

  1. hashCode(): 该方法用于计算对象的哈希码。HashSet 使用哈希码来确定对象在集合中的存储位置。如果两个对象的哈希码不同,那么它们就被认为是不同的对象。
  2. equals(): 如果两个对象的哈希码相同,HashSet 会使用 equals() 方法来进一步比较这两个对象。如果 equals() 方法返回 true,那么这两个对象就被认为是相等的,否则它们是不相等的。

需要注意的是,当你向 HashSet 中添加元素时,它会首先调用该元素的 hashCode() 方法来计算其哈希码,然后根据哈希码确定该元素在集合中的存储位置。如果在同一位置已经有一个或多个元素(具有相同的哈希码),那么 HashSet 会使用 equals() 方法来比较新元素与已有元素,以确保不会添加重复的元素。

因此,为了确保 HashSet 正确工作,你需要在自定义类中重写 hashCode()equals() 方法。这两个方法应该保持一致:如果两个对象相等(根据 equals() 方法),那么它们的哈希码(由 hashCode() 方法计算得出)也应该相等。反过来,如果两个对象的哈希码相等,并不意味着这两个对象一定相等,但此时 HashSet 会使用 equals() 方法来进一步判断它们是否相等。

equals()方法在比较两个对象时如何运作?

equals() 方法在 Java 中用于比较两个对象的内容是否相等。默认情况下,Object 类中的 equals() 方法实现的是引用比较,即只有当两个引用指向同一个对象时,才会返回 true。然而,对于许多类(如 StringArrayList、自定义类等),我们需要根据对象的内容来判断它们是否相等,这时就需要重写 equals() 方法。

在重写 equals() 方法时,通常需要遵循以下原则:

  1. 对称性:如果 x.equals(y) 返回 true,那么 y.equals(x) 也应该返回 true

  2. 反射性:对于任何非空引用值 xx.equals(x) 必须返回 true

  3. 传递性:如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 也应该返回 true

  4. 一致性:对于任何非空引用值 xy,只要 equals 比较操作在应用程序的执行过程中没有被修改,多次调用 x.equals(y) 始终返回 true 或始终返回 false

  5. 非空性:对于任何非空引用值 xx.equals(null) 必须返回 false

当你重写 equals() 方法时,通常也需要重写 hashCode() 方法,以确保满足以下条件:

  • 如果两个对象根据 equals(Object) 方法是相等的,那么调用这两个对象的 hashCode 方法必须产生相同的整数结果。
  • 如果两个对象根据 equals(java.lang.Object) 方法是不相等的,那么调用这两个对象的 hashCode 方法不一定产生不同的整数结果。

这是因为 HashSetHashMap 等基于哈希的集合在存储和检索元素时会使用 hashCode() 方法。如果两个对象相等(根据 equals() 方法),但它们的哈希码不同,那么这些集合可能无法正确地存储或检索这些对象。

下面是一个简单的例子,展示了如何在自定义类中重写 equals()hashCode() 方法:

public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return age == person.age &&Objects.equals(name, person.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}

在这个例子中,Person 类的 equals() 方法首先检查传入的对象是否与当前对象是同一个实例(this == o),然后检查传入的对象是否为 null 或者是否与当前对象属于同一个类。如果满足这些条件,它将强制类型转换为 Person 类型,并比较 nameage 字段是否相等。

hashCode() 方法使用 Objects.hash() 方法,该方法可以接受多个参数,并根据这些参数生成一个哈希码。在这个例子中,我们传递了 nameage 字段作为参数,以确保具有相同字段值的对象具有相同的哈希码。

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

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

相关文章

LeetCode、338. 比特位计数【简单,位运算】

文章目录 前言LeetCode、338. 比特位计数【中等,位运算】题目链接与分类思路位运算移位处理前缀思想实现 资料获取 前言 博主介绍:✌目前全网粉丝2W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java…

Vue3快速上手(三)Composition组合式API及setup用法

一、Vue2的API风格 Vue2的API风格是Options API,也叫配置式API。一个功能的数据&#xff0c;交互&#xff0c;计算&#xff0c;监听等都是分别配置在data, methods&#xff0c;computed, watch等模块里的。如下&#xff1a; <template><div class"person"…

Leetcode 606.根据二叉树创建字符串

给你二叉树的根节点root&#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对"root"表示&#xff0c;转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射…

[ai笔记1] 借着“ai春晚”开个场

1 文思ai笔记-新的开始 今天是2024年2月29日&#xff0c;也是传统农历的除夕夜。早起在ai圈看到一个比较新奇的消息&#xff0c;ai春晚今日举办&#xff0c;竟然有一点小小的激动。这些年确实好久没看过春晚了&#xff0c;自己对于春晚的映像还停留在“白云黑土”、“今天&…

论文解读:MobileOne: An Improved One millisecond Mobile Backbone

论文创新点汇总&#xff1a;人工智能论文通用创新点(持续更新中...)-CSDN博客 论文总结 关于如何提升模型速度&#xff0c;当今学术界的研究往往聚焦于如何将FLOPs或者参数量的降低&#xff0c;而作者认为应该是减少分支数和选择高效的网络结构。 概述 MobileOne(≈MobileN…

react【五】redux/reduxToolkit/手写connext

文章目录 1、回顾纯函数2、redux2.1 redux的基本使用2.2 通过action修改store的数值2.3 订阅state的变化2.4 目录结构2.5 Redux的使用过程2.6 redux的三大原则2.7 Redux官方图 3、redux在React中的使用4、react-redux使用4.1 react-redux的基本使用4.2 异步请求 redux-thunk4.3…

课时26:内容格式化_常用符号解读_终端输出

3.1.2 终端输出 学习目标 这一节&#xff0c;我们从 后台执行、信息符号、小结 三个方面来学习。 后台执行 简介 & 就是将一个命令从前台转到后台执行,使用格式如下&#xff1a;命令 &简单演示 前台执行休眠命令 [rootlocalhost ~]# sleep 4 界面卡住4秒后消失后…

字符串大小比较的方法以及函数的多返回值

1.字符串的大小比较: 按照ASCII码表的值进行比较字符串大小 print(f"abc大于abd,结果为{abc>abd}") #结果为布尔类型False print(f"a大于A,结果为{a>A}") #True print(f"key1大于key2,结果为{key1>key2}") #False 2.函数的多返回值: …

分布式文件系统 SpringBoot+FastDFS+Vue.js

分布式文件系统 SpringBootFastDFSVue.js 一、分布式文件系统1.1.文件系统1.2.什么是分布式文件系统1.3.分布式文件系统的出现1.3.主流的分布式文件系统1.4.分布式文件服务提供商1.4.1.阿里OSS1.4.2.七牛云存储1.4.3.百度云存储 二、fastDFS2.1.fastDSF介绍2.2.为什么要使用fas…

<s-table>、<a-table>接收后端数据

对于 中的 <template #bodyCell“{ column, record }”> &#xff1a; <s-tableref"table":columns"columns":data"loadData":alert"options.alert.show"bordered:row-key"(record) > record.id":tool-config&…

MacOS - M1芯片 Mac 在“恢复”模式中启用系统扩展教程

部分软件需要开启系统扩展才能正常使用&#xff0c;但是默然M1芯片的Mac不能直接打开系统扩展&#xff0c;如下两图。 若要启用系统扩展&#xff0c;您需要在“恢复”环境中修改安全性设置。 若要执行此操作&#xff0c;请将系统关机&#xff0c;然后按住触控ID或电源按钮以开…

MATLAB 1:基础知识

MATLAB中的数据类型主要包括数值类型、逻辑类型、字符串、函数句柄、结构体和单元数组类型。这六种基本的数据类型都是按照数组形式存储和操作的。 MATLAB中还有两种用于高级交叉编程的数据类型&#xff0c;分别是用户自定义的面向对象的用户类类型和Java类类型。 1.1.1数值类…

Stable Diffusion 模型下载:majicMIX reverie 麦橘梦幻

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十

二级 C 语言笔试-12

一、选择题 1. 软件是指 A) 程序 B) 程序和文档 C) 算法加数据结构 D) 程序、数据与相关文档的完整集合 2. 下面不属于软件设计原则的是 A) 抽象 B) 模块化 C) 白底向上 D) 信息隐蔽 3. 树是结点的集合&#xff0c;它的根结点的数目是( )。 A) 有且只有 1 个 B) 1 或多于 1 C) …

洛谷: P9749 [CSP-J 2023] 公路

思路: 贪心思想指的是在对问题求解的时候&#xff0c;总是能做出在当前看来是最好的选择,也就是说&#xff0c;如果要得到整个问题的最优答案&#xff0c;那么要求每一步都能做出最好的选择&#xff08;feihua&#xff09;。 在这道题里面&#xff0c;我们希望在来到第i站的时…

Windows搭建docker+k8s

安装Docker Desktop 从官网下载&#xff0c;然后直接安装即可&#xff0c;过程很简单&#xff0c;一直Next就行。 有一点需要注意就是要看好对应的版本&#xff0c;因为后边涉及到版本的问题。 https://www.docker.com/products/docker-desktop 安装完成&#xff0c;双击图…

Python列表clear()方法详解与实例

Python列表clear()方法详解与实例 &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;clear()&#x1f333;&#x1f340;功能介绍&#x1f340;&#x1f340;语法&#x1f340;&#x1f340;示例&#x1f340;&#x1f340;注意事项&#x1f34…

go面试题--使用两个goroutine交替打印数字与字母

使用两个goroutine交替打印数字与字母 题目如下&#xff1a; 使用两个goroutine交替打印序列&#xff0c;一个goroutine打印数字&#xff0c;另外一个goroutine打印字母&#xff0c;最终效果如下&#xff1a; 12AB34CD56EF78GH910IZ1112KL1314MN1516OP1718QR1920ST2122UV2324W…

【白话前端】快速区分webGL,webGPU,unity3D和UE4

在3D图形渲染的渲染领域&#xff0c;很多友友们对上述概念傻傻分不清&#xff0c;站在前端开发角度&#xff0c;我用简单语言说下&#xff0c;结论在文章最后。 一、四者都能进行3D图形渲染 它们之间有一些区别&#xff0c;下面我将对它们进行简单的区分&#xff1a; WebGPU&a…

探索设计模式的魅力:捕捉变化的风-用观察者模式提升用户体验

设计模式专栏&#xff1a;http://t.csdnimg.cn/U54zu 目录 一、引言 核心概念 应用场景 可以解决的问题 二、场景案例 2.1 不用设计模式实现 2.2 存在问题 2.3 使用设计模式实现 2.4 成功克服 三、工作原理 3.1 结构图和说明 3.2 工作原理详解 3.3 实现步骤 四、 优…