[Java] 重写equals为什么要重写hashcode方法?

背景

假设我们可能会遇到两个对象,它们的属性都是一样。
而我们的需求 要认为这两对象是同一个,但是在JAVA上它们两是不同的对象,使用equals时就会返回false。

所以我们要重写equals。

public class MyUser {public String id;public MyUser(String id) {this.id = id;}@Overridepublic boolean equals(Object obj) {if(obj instanceof MyUser){return id.equals(((MyUser)obj).id);}return false;}public static void main(String[] args) {MyUser a = new MyUser("1");MyUser b = new MyUser("1");System.out.println(a.equals(b));//输出:true}
}

这时候两个同ID不同对象使用equals就相等了。

但是!我们使用Set集合的时候就出现了问题。

HashSet<MyUser> mySet = new HashSet<>();
mySet.add(a);
mySet.add(b);
System.out.println(mySet);
//输出:[com.malu.bili.acquisition.util.MyUser@4ccabbaa, com.malu.bili.acquisition.util.MyUser@108c4c35]

我们用Set集合保存了上面的a和b。
我们的需求要认为这个两个是一个对象,那保存到Set肯定会进行去重。
然而,HashSet里面依然保存两个对象。
原因是HashSet是基于HashMap实现,而HashMap需要使用hashcode计算对象保存的位置。
而没有重写hashcode,他们的hashcode是不一样的(极大概率),所以计算出来的位置是不一样的,不能保存到同一个位置。

所以!我们要重写hashcode

public class MyUser {public String id;public MyUser(String id) {this.id = id;}@Overridepublic boolean equals(Object obj) {if(obj instanceof MyUser){return id.equals(((MyUser)obj).id);}return false;}@Overridepublic int hashCode() {return id.hashCode();}
}

这样解决了,Set里面就只保存了一个对象。
这边我偷了个懒,因为只有id一个属性,我就直接返回了id的hashcode

假设我的对象不止有id,它还有nameage,那该怎么重写?

如何重写hashcode方法

@Override
public int hashCode() {int hash = 17;hash = hash * 31 + getId().hashCode();hash = hash * 31 + getName().hashCode();hash = hash * 31 + getAge();return hash;
}

假设如果不想自己写,而你项目恰好还用了Lombok
在类上使用 @EqualsAndHashCode

@EqualsAndHashCode
public class MyUser {public String id;public String name;public int age;
}

总结

所以你们有遇到需要重写hashcode的情况嘛?
我是没遇到。

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

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

相关文章

1312. 序列统计

1312. 序列统计 - AcWing题库 L~R范围可以等同于0~R-L范围 相当于在R-L1个数中选出k个数 令 则变为 相当于在R-Lk个数中选出k个数 需要计算 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing namespace std;t…

本地vscode安装GPU版本PyTorch

操作系统 windows, IDE环境vscode&#xff0c;本地GPU 可以新建一个jupyter文件&#xff0c;运行一些测试代码 确保装好显卡驱动 在底下调出终端窗口&#xff0c;默认是power shell&#xff0c;我喜欢用cmd窗口 激活自己的虚拟环境&#xff0c;输入命令 nvidia-smi 确保自己…

大模型的超级“外脑”——向量数据库解决大模型的三大挑战

随着AI大模型产品及应用呈现爆发式增长,新的AI时代已经到来。向量数据库可与大语言模型配合使用,解决大模型落地过程中的痛点,已成为企业数据处理和应用大模型的必选项。在近日举行的华为全联接大会2023期间,华为云正式发布GaussDB向量数据库。GaussDB向量数据库基于GaussD…

PHP - 遇到的Bug - 总结

BUG记录1 [问题] 除数为0&#xff0c;不符合规则 [问题描述] // 报错信息 DivisionByZeroError&#xff1a;is thrown when an attempt is made to divide a number by zero.// example public class Example {public static void Main(){int number1 3000;int number2 0;tr…

ubuntu 通过apt-get快速安装 docker

在使用 apt-get 安装 Docker 之前,你需要确保你的系统已经准备好并且已经更新了软件包列表。以下是在 Ubuntu 系统上使用 apt-get 安装 Docker 的步骤: 更新软件包列表: sudo apt-get update 安装依赖软件包,以确保可以通过 HTTPS 使用存储库: sudo apt-get install apt-t…

【2023年11月第四版教材】第24章《法律法规与标准规范》(合集篇)

第24章《法律法规与标准规范》(合集篇&#xff09; 1 民法典&#xff08;合同编&#xff09;2 招标投标法2.1 关于时间的总结2.2 内容 3 政府采购法4 专利法5 著作权法6 商标法7 网络安全法8 数据安全法 1 民法典&#xff08;合同编&#xff09; 1、要约是希望和他人订立合同的…

实施运维02

一.网线制作 1.所需材料 网线&#xff0c;水晶头&#xff0c;网线钳&#xff0c;水晶头, 路由器或者网络测速仪 网线钳 网线制作标准 T568A标准&#xff08;交叉线&#xff09;&#xff1a;适用链接场合&#xff1a;电脑-电脑、交换机-交换机、集线器-集线器 接线顺序&…

3.2python使用 matplotlib 实现可视化_python量化实用版教程(初级)

使用 matplotlib 实现可视化 Matplotlib 的主要模块是 pyplot&#xff0c;它提供了类似于 Matlab 的绘图接口。 安装命令&#xff1a;pip install matplotlib 下面是一个简单的示例代码&#xff0c;演示了如何使用 Matplotlib 绘制折线图&#xff1a; import matplo…

Session和分布式Session

参考下面的文章 https://blog.csdn.net/qq_15096707/article/details/74012116 https://blog.51cto.com/u_15239532/2836488 思考 一、session是如何用在登录中的 session可以用在登录中吗&#xff1f;可以。 0.第一次访问未登录&#xff0c;服务端重定向跳转到登录验证 1.在…

mac 版hadoop3.2.4 解决 Unable to load native-hadoop library 缺失文件

mac 版hadoop3.2.4或其他版本 Unable to load native-hadoop library 缺失文件 Native 包报错缺失&#xff1a; 1. hadoop-3.2.4/lib/native里加*.dylib 2. hadoop-3.2.4/etc/hadoop/hadoop-env.sh 加或修改 export HADOOP_OPTS"-Djava.library.path/Users/lvan/Documen…

Python jieba库的使用说明

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 一、jieba库基本介绍 jieba库概述 jieba是优秀的中文分词第三方库 中文文本需要通过分词获得单个的词语 jieba是优秀的中文分词第三方库&#xff0c;需要额外安…

Java实验一 Java语言基础(12题)

文章目录&#xff1a; 1、我国历法中的天干、地支和生肖的排列是有规律的。天干的顺序是“甲乙丙丁戊己庚辛壬癸”&#xff0c;地支的顺序是“子丑寅卯辰巳午未申酉戌亥”&#xff0c;生肖的顺序是“鼠牛虎兔龙蛇马羊猴鸡狗猪”。天干、地支、生肖的计算方法非常简单&#xff…

新手如何快速上手HTTP爬虫IP?

对于刚接触HTTP爬虫IP的新手来说&#xff0c;可能会感到有些困惑。但是&#xff0c;实际上HTTP爬虫IP并不复杂&#xff0c;只要掌握了基本的操作步骤&#xff0c;就可以轻松使用。本文将为新手们提供一个快速上手HTTP爬虫IP的入门指南&#xff0c;帮助您迅速了解HTTP爬虫IP的基…

速通RabbitMQ的五种常见消费模型

目录 引言1. 简单队列模型&#xff08;Simple Queue Model&#xff09;优缺点及适用场景代码示例 2. 工作队列模型&#xff08;Work Queue Model&#xff09;优缺点及适用场景代码示例 3. 发布/订阅模型&#xff08;Publish/Subscribe Model&#xff09;优缺点及适用场景代码示…

08. 机器学习- 线性回归

文章目录 线性回归 LINEAR REGRESSION 从本次课程开始&#xff0c;大部分时候我将不再将打印结果贴出来了&#xff0c;因为太占用篇幅。小伙伴可以根据我的输出执行敲一遍代码来进行学习和验证。 同样是为了节省篇幅&#xff0c;我也不会再一行行那么仔细的解释代码了&#xff…

C语言中文网 - Shell脚本 - 5

第1章 Shell基础&#xff08;开胃菜&#xff09; 5. Linux Shell命令的基本格式 进入 Shell 以后&#xff0c;我们就可以输入命令来使用 Linux 的各种功能了&#xff0c;但是在真正使用 Shell 命令之前&#xff0c;我们有必要先学习一下 Shell 命令的基本格式。 进入 Shell 之…

python基础语法(五)

目录 函数函数是什么语法格式函数参数函数返回值 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412;个人主页 &#x1f978;&#x1f978;&#x1f978;C语言 &#x1f43f;️&#x1f43f;️&#x1f43f;️C语言例题 &…

Springcloud中间件-----分布式搜索引擎 Elasticsearch

该笔记是根据黑马程序员的课来自己写了一遍的,b站有对应教程和资料 第一部分 第二部分 第三部分 预计看完跟着练习5小时足够 1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff…

提升战斗力!吃鸡行家分享顶级游戏干货,助你轻松拿下绝地求生

作为吃鸡行家&#xff0c;我们都知道&#xff0c;在绝地求生中提高战斗力至关重要。今天我来分享一些独特的干货&#xff0c;帮助你成为顶级的吃鸡玩家&#xff0c;并分享一些方便吃鸡作图、装备皮肤库存展示和查询的技巧。 首先&#xff0c;让我们来谈谈绝地求生作图工具推荐。…

花体字母代表什么

26个英文字母的花体字如下&#xff1a; 大写&#xff1a;&#x1d4d0;&#x1d4d1;&#x1d4d2;&#x1d4d3;&#x1d4d4;&#x1d4d5;&#x1d4d6;&#x1d4d7;&#x1d4d8;&#x1d4d9;&#x1d4da;&#x1d4db;&#x1d4dc;&#x1d4dd;&#x1d4de;&#x…