为什么重写equals必须重写hashCode
关于这个问题,看了网上很多答案,感觉都参差不齐,没有答到要点,这次就记录一下!
首先我们为什么要重写equals?这个方法是用来干嘛的?
public boolean equals (Object object){return (this == obj);
}
上面是在Object类里面的定义,可以看到它的作用仅仅是用来确认两个对象地址是否一样!
那实际当中我们肯定不满足于这个方式啊!我们一般是想知道两个对象里面的数据是否对的上!
最直接的例子就是String!这里官方给我们重写了equals方法,从而使得我们在进行比较不同的string的时候比较的不是它们的地址,而是字面值!!!具体源码大家可以自己去看。
我这里也定义了一个类,然后演示一下重定义equals前后的结果:
public class People {private String name;public People(String name){this.name=name;}public void setName(String name) {this.name = name;}public String getName() {return name;}public String toString(){return "Peopel"+"name:"+name;}}
public class a {public static void main(String[] args) {People hj=new People("wx");People nn=new People("wx");System.out.println(hj.equals(nn));}
}

这是测试主类,输出是false!(两个对象地址不一样,当时输出false,因为这个时候我们没有重写equals方法!!!) 但是实际当中我们当然期望是true!因为这里两个对象里面属性是完全一样。
那么我们重写一下,看看最后的结果!
public boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;People other = (People) obj;if (name != other.name)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}
上面是重写的方法,具体的话大家自己看,逻辑也很清楚!

这次我们实现了输出true(开心)
--------------------------------------------------------------------------------------------------------------------------------至此我们搞懂了重写equals的目的!!
下面正式进入主题!hashcode!
首先定义一下hashcode:它是一个函数,将对象映射成一个整数
那么大家会说,这个函数是什么?
(165条消息) Java 的 HashCode 底层生成分析_董酷酷的博客-CSDN博客_hashcode底层
具体大家可以看这个链接,给大家总结一下哈,这个函数一般是伪随机数生成函数,和对象地址是无关的!(除非你指定编译器参数)
那么我们为啥要重写这个函数呢?
让含有相同参数的对象 映射成相同的hashcode!!!(这句话很关键,我下面的阐述都是基于此展开的)
有人有会问为什么要映射成相同的hashcode呢?那我举个最简单的例子吧!
我现在有个hashmap,对象为k,v就是1
当你第一次 push一个对象(参数是a)后
第二次 push一个对象(参数也是a)
正常来说我们希望,后面的put操作会覆盖前面的
但如果你不重写hashcode就不会实现覆盖,map里会包含两个对象
这是因为hashmap put的原理是,首先判断对象的hashcode,如果不等,直接判断为不同的key,如果相等,则执行equals方法来看是否相同
下面是代码!
public class a {public static void main(String[] args) {HashMap<People,Integer> map=new HashMap();People cxk=new People("wx");map.put(cxk,1);People yyqx=new People("wx");map.put(yyqx,1);map.forEach((k,v)->{System.out.println(k);});}
}
这是测试类,最后结果是:

那我们重写hashcode后:

ok,实际上重写hashcode主要保证的是一致性:相同参数的对象映射到相同的hash值,从而保证我们在集合里面能够正确的实现。
相关文章:
为什么重写equals必须重写hashCode
关于这个问题,看了网上很多答案,感觉都参差不齐,没有答到要点,这次就记录一下! 首先我们为什么要重写equals?这个方法是用来干嘛的? public boolean equals (Object object&#x…...
< 每日小技巧:N个很棒的 Vue 开发技巧, 持续记录ing >
每日小技巧:6 个很棒的 Vue 开发技巧👉 ① Watch 妙用> watch的高级使用> 一个监听器触发多个方法> watch 监听多个变量👉 ② 自定义事件 $emit() 和 事件参数 $event👉 ③ 监听组件生命周期常规写法hook写法ὄ…...
数据结构与算法之二分查找分而治之思想
决定我们成为什么样人的,不是我们的能力,而是我们的选择。——《哈利波特与密室》二分查找是查找算法里面是很优秀的一个算法,特别是在有序的数组中,这种算法思想体现的淋漓尽致。一.题目描述及其要求请实现无重复数字的升序数组的…...
训练自己的中文word2vec(词向量)--skip-gram方法
训练自己的中文word2vec(词向量)–skip-gram方法 什么是词向量 将单词映射/嵌入(Embedding)到一个新的空间,形成词向量,以此来表示词的语义信息,在这个新的空间中,语义相同的单…...
ubuntu系统环境配置和常用软件安装
系统环境 修改文件夹名称为英文 参考链接 export LANGen_US xdg-user-dirs-gtk-update 常用软件安装 常用工具 ping 和ifconfig工具 sudo apt install -y net-tools inetutils-ping 截图软件 sudo apt install -y net-tools inetutils-ping flameshot 录屏 sudo apt-get i…...
【1139. 最大的以 1 为边界的正方形】
来源:力扣(LeetCode) 描述: 给你一个由若干 0 和 1 组成的二维网格 grid,请你找出边界全部由 1 组成的最大 正方形 子网格,并返回该子网格中的元素数量。如果不存在,则返回 0。 示例 1&#…...
windows11安装sqlserver2022报错
window11安装SQL Server 2022 报错 糟糕… 无法安装SQL Server (setup.exe)。此 SQL Server安装程序介质不支持此OS的语言,或没有SQL Server英语版本的安装文件。请使用匹配的特定语言SQL Server介质;或安装两个特定语言MUI,然后通过控制面板的区域设置…...
Python快速上手系列--日志模块--详解篇
前言本篇主要说说日志模块,在写自动化测试框架的时候我们就需要用到这个模块了,方便我们快速的定位错误,了解软件的运行情况,更加顺畅的调试程序。为什么要用到日志模块,直接print不就好了!那得写多少print…...
【THREE.JS学习(1)】绘制一个可以旋转、放缩的立方体
学习新技能,做一下笔记。在使用ThreeJS的时候,首先创建一个场景const scene new THREE.Scene();接着,创建一个相机其中,THREE.PerspectiveCamera()四个参数分别为:1.fov 相机视锥体竖直方向视野…...
数仓实战 - 滴滴出行
项目大致流程: 1、项目业务背景 1.1 目的 本案例将某出行打车的日志数据来进行数据分析,例如:我们需要统计某一天订单量是多少、预约订单与非预约订单的占比是多少、不同时段订单占比等 数据海量 – 大数据 hive比MySQL慢很多 1.2 项目架…...
python虚拟环境与环境变量
一、环境变量 1.环境变量 在命令行下,使用可执行文件,需要来到可执行文件的路径下执行 如果在任意路径下执行可执行文件,能够有响应,就需要在环境变量配置 2.设置环境变量 用户变量:当前用户登录到系统,…...
BeautifulSoup文档4-详细方法 | 用什么方法对文档树进行搜索?
4-详细方法 | 用什么方法对文档树进行搜索?1 过滤器1.1 字符串1.2 正则表达式1.3 列表1.4 True1.5 可以自定义方法2 find_all()2.1 参数原型2.2 name参数2.3 keyword 参数2.4 string 参数2.5 limit 参数2.6 recursive 参数3 find()4 find_parents()和find_parent()5…...
初识Tkinter界面设计
目录 前言 一、初识Tkinter 二、Label控件 三、Button控件 四、Entry控件 前言 本文简单介绍如何使用Python创建一个界面。 一、初识Tk...
软件测试面试题中的sql题目你会做吗?
目录 1.学生表 2.一道SQL语句面试题,关于group by表内容: 3.表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列 4. 5.姓名:name 课程:subject 分数&…...
VS实用调试技巧
一.什么是BUG🐛Bug一词的原意是虫子,而在电脑系统或程序中隐藏着的一些未被发现的缺陷或问题,人们也叫它"bug"。这是为什么呢?这就要追溯到一个程序员与飞蛾的故事了。Bug的创始人格蕾丝赫柏(Grace Murray H…...
通俗易懂理解三次握手、四次挥手(TCP)
文章目录1、通俗语言理解1.1 三次握手1.2 四次挥手2、进一步理解三次握手和四次挥手2.1 三次握手2.2 四次挥手1、通俗语言理解 1.1 三次握手 C:客户端 S:服务器端 第一次握手: C:在吗?我要和你建立连接。 第二次握手ÿ…...
1.1 什么是并发
1.1 什么是并发 并发:指两个或更多独立的活动同时发生。并发在生活中随处可见。我们可以一边走路一边说话,也可以两只手同时做不同的动作。 1.1.1 计算机系统中的并发 当我们提到计算机术语的“并发”,指的是在单个系统里同时执行多个独立…...
万字讲解你写的代码是如何跑起来的?
今天我们来思考一个简单的问题,一个程序是如何在 Linux 上执行起来的? 我们就拿全宇宙最简单的 Hello World 程序来举例。 #include <stdio.h> int main() {printf("Hello, World!\n");return 0; } 我们在写完代码后,进行…...
034.Solidity入门——21不可变量
Solidity 中的不可变量是在编译时就被确定的常量,也称为常量变量(constant variable)或只读变量(read-only variable)。这些变量在定义时必须立即初始化,并且在整个合约中都无法被修改,可以在函…...
Vulnhub 渗透练习(四)—— Acid
环境搭建 环境下载 kail 和 靶机网络适配调成 Nat 模式,实在不行直接把网络适配还原默认值,再重试。 信息收集 主机扫描 没扫到,那可能端口很靠后,把所有端口全扫一遍。 发现 33447 端口。 扫描目录,没什么有用的…...
DamoFD在智慧社区门禁系统落地:0.5G模型支撑多终端低延迟识别
DamoFD在智慧社区门禁系统落地:0.5G模型支撑多终端低延迟识别 1. 项目背景与需求分析 智慧社区建设正在快速发展,门禁系统作为社区安全的第一道防线,面临着新的挑战和机遇。传统门禁系统往往存在识别速度慢、准确率不高、设备成本高等问题&…...
DeepSeek-OCR-2部署教程:阿里云ECS+GPU实例一键部署OCR服务全流程
DeepSeek-OCR-2部署教程:阿里云ECSGPU实例一键部署OCR服务全流程 本文介绍如何在阿里云ECS GPU实例上快速部署DeepSeek-OCR-2模型,搭建完整的OCR识别服务。 1. 环境准备与服务器选择 1.1 服务器配置要求 DeepSeek-OCR-2作为高性能OCR模型,对…...
CLIP-GmP-ViT-L-14步骤详解:Gradio界面添加下载按钮导出匹配结果
CLIP-GmP-ViT-L-14步骤详解:Gradio界面添加下载按钮导出匹配结果 如果你用过CLIP模型来匹配图片和文字,可能会遇到一个问题:计算出的相似度分数,只能看,不能存。每次都得手动截图或者复制粘贴,特别麻烦。今…...
2026全网最全“养虾”指南:阿里、腾讯、字节本地版 Open Claw 深度测评
2026年3月,整个 AI 圈和程序员圈最火的词只有一个:“养虾”。 这只火遍全球的“龙虾”——Open Claw,并非某个商业公司的封闭产品,而是一个完全开源的桌面级 AI Agent(智能体)项目。只要给它配置好 API Ke…...
Flutter 三方库 generic_reader 鸿蒙适配指南 - 实现生成器强类型提取、在 OpenHarmony 上打造无感元编程生态实战
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net Flutter 三方库 generic_reader 鸿蒙适配指南 - 实现生成器强类型提取、在 OpenHarmony 上打造无感元编程生态实战 前言 在鸿蒙(OpenHarmony)生态的进阶架构体系中…...
PTA 树与二叉树 2 根据先序+中序遍历序列构造二叉树
作者 张鏖烽单位 湖南工程学院计算机与通信学院从键盘输入一个二叉树的先序遍历序列和中序遍历序列,编程实现下列函数:(1)CreateBT_PI(pre,in,n):根据先序遍历序列*pre和中序遍历*in构造二叉链树;(2&#x…...
BioCredProv.dll文件彻底修复方法 附免费的下载解决办法
在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…...
从搜索推荐到生成式AI:信息获取底层逻辑的三次重构
每一次技术浪潮的涌现,都在悄然重写人与信息之间的连接方式。从门户网站到搜索引擎,从算法推荐到今天的生成式AI,表面上是产品形态的更迭,底层驱动的却始终是同一个命题:如何持续降低信息获取的摩擦,持续提…...
【详解】使用Java解决:将一个数按原有规律插入已排序数组
使用Java解决:将一个数按原有规律插入已排序数组在日常编程中,我们经常遇到需要对已排序的数组进行操作的情况。其中一个常见的问题是:给定一个已经按照升序或降序排列的数组,以及一个待插入的新元素,如何将这个新元素…...
O3DE引擎全面解析:从基础到高级的开源3D创作平台完全指南
O3DE引擎全面解析:从基础到高级的开源3D创作平台完全指南 【免费下载链接】o3de Open 3D Engine (O3DE) is an Apache 2.0-licensed multi-platform 3D engine that enables developers and content creators to build AAA games, cinema-quality 3D worlds, and hi…...
