Java面试题 -- 为什么重写equals就一定要重写hashcode方法
在回答这个问题之前我们先要了解equals与hascode方法的本质是做什么的
1. equals方法
public boolean equals(Object obj) {return (this == obj);}
我们可以看到equals在不重写的情况下是使用==判断地址值是否相同
所以默认的 equals 的逻辑就是判断的双方是否引用了一个对象,如果是那就是相等的,如果不是那就不相等。
默认的 equals 看似能满足我们的要求,但有些情况下却不能。在开发过程中,我们更希望比较的是两个对象的内容是否相等
package com.Month08.Day_02;import java.util.Objects;public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public Person() {}
}
package com.Month08.Day_02;import java.util.stream.Stream;public class Test {public static void main(String[] args) {Person a = new Person("a",4);Person b = new Person("a", 4);System.out.println(a.equals(b));}
}

可以看到在这里我们传入相同的值的情况下得到的结果却是false
2. HashCode
简而言之hashcode是通过将内部存储地址映射成一个整型值,这个整型值就是hashcode
默认情况下,hashCode()方法返回的是对象的内存地址的哈希码表示。
public int hashCode() {int h = hash;if (h == 0 && !hashIsZero) {h = isLatin1() ? StringLatin1.hashCode(value): StringUTF16.hashCode(value);if (h == 0) {hashIsZero = true;} else {hash = h;}}return h;}
3. 什么是散列表
在Java中,散列表(Hash Table)是一种非常重要的数据结构,它通过哈希函数(Hash Function)将输入(通常是键Key)映射到表中一个位置来访问记录,以加快查找的速度。散列表通常是以数组的形式实现的,但不同于普通的数组,散列表中的每个槽位(slot)并不直接存储数据,而是存储数据的索引(或称为指针),这个索引指向实际存储数据的位置。这种设计使得数据的查找、插入和删除操作都非常快
- HashMap:这是Java中最常用的类之一,它实现了Map接口,是一个基于哈希表的Map接口的非同步实现。HashMap允许使用null值和null键,不保证映射的顺序;特别是它不保证该顺序随时间的推移保持不变。
- Hashtable:虽然名为Hashtable,但它实际上也是一个散列表的实现。不过,与HashMap相比,Hashtable是同步的,这意味着它在多线程环境下是安全的。但是,由于同步操作带来的开销,Hashtable在单线程环境下的性能通常低于HashMap。另外,Hashtable不允许键或值为null。
- LinkedHashMap:这个类扩展了HashMap,并维护了一个运行于所有条目的双重链接列表。这个链表定义了迭代器遍历条目的顺序,该顺序可以是插入顺序或者是访问顺序(取决于构造器中的accessOrder参数)。
- TreeMap:虽然TreeMap不是基于哈希表的,但它实现了Map接口,并且可以看作是一种有序的映射(基于红黑树实现)。这里提到它是因为它在某些方面与HashMap等散列表实现有对比意义。
3. 只重写equals会导致什么问题?
在这个Person类中我们只重写了equals方法
package com.Month08.Day_02;import java.util.Objects;public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public Person() {}@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);}}
如何我们在测试类中new两个对象 , 因为此时的euqals方法已经被重写 , 尽管对象a , b的地址值不同但是因为都是空参 , 也就是传入的值相同会使得a.equals(b)为true , 但是优惠遇到一个问题也就是HashCode值不相同
package com.Month08.Day_02;import java.util.stream.Stream;public class Test {public static void main(String[] args) {Person a = new Person();Person b = new Person();System.out.println(a); // com.Month08.Day_02.Person@214c265eSystem.out.println(b); // com.Month08.Day_02.Person@448139f0System.out.println(a.hashCode()); // 558638686System.out.println(b.hashCode()); // 1149319664System.out.println(a.equals(b)); // true}
}
我们知道在散列表中如hashmap中 , 在储存元素之前会通过计算key的值来确定key是否重复 , 那么回到上面的问题 , 如果 我们将a , b这两个对象作为key进行储存 , 通过HashCode计算发现他们HashCode不相同 , 那么这两个对象到底是相同的还是不同的呢?
HashMap<Person, String> map = new HashMap<>();map.put(a , "123");map.put(b , "456");System.out.println(map.get(a)); //123System.out.println(map.get(b)); // 456
所以为了避免这样的问题 , 我们在重写equals的时候同时需要重新hashcode
相关文章:
Java面试题 -- 为什么重写equals就一定要重写hashcode方法
在回答这个问题之前我们先要了解equals与hascode方法的本质是做什么的 1. equals方法 public boolean equals(Object obj) {return (this obj);}我们可以看到equals在不重写的情况下是使用判断地址值是否相同 所以默认的 equals 的逻辑就是判断的双方是否引用了一个对象&am…...
J031_使用TCP协议支持与多个客户端同时通信
一、需求文档 使用TCP协议支持与多个客户端同时通信。 1.1 Client package com.itheima.tcp2;import java.io.DataOutputStream; import java.io.OutputStream; import java.net.Socket; import java.util.Scanner;public class Client {public static void main(String[] a…...
二分查找(精确查找、范围搜索)
目录 1. 二分查找概述2. 精确查找2.1 【left,right】2. 2 【left,right) 3. 范围查找总结 1. 二分查找概述 二分查找法,也称为二分搜索法或折半查找法,是一种在有序数组中查找特定元素的搜索算法。其基本思想是&#x…...
软件工程简记
文章目录 一、软件工程要点之软件设计二、UML(Unified Modeling Language,统一建模语言)(一)UML 的整体分类与部分功能(二)UML 各类图的具体内容三、开发模型(一)多种开发模型的特点与问题四、设计模式(一)设计模式的总体概念与原则(二)软件结构设计原则(三)常见…...
【深度学习】【语音TTS】OpenVoice v2,测评,中英文语料,Docker镜像,对比GPT-SoVITS、FishAudio、BertVITS2
https://github.com/myshell-ai/OpenVoice/blob/main/docs/USAGE.md 实际体验OpenVoice v2的TTS效果。 文章目录 环境启动 jupyter代码代码分析主要模块和功能测试一些别的中文和中英文混合总结优点缺点对比GPT-SoVITS、FishAudio、BertVITS2使用我的Docker镜像快速体验OpenVo…...
Kotlin OpenCV 图像图像50 Haar 级联分类器模型
Kotlin OpenCV 图像图像50 Haar 级联分类器模型 1 OpenCV Haar 级联分类器模型2 Kotlin OpenCV Haar 测试代码 1 OpenCV Haar 级联分类器模型 Haar级联分类器是一种用于对象检测(如人脸检测)的机器学习算法。它由Paul Viola和Michael Jones在2001年提出…...
嗖嗖移动业务大厅(Java版)
首先对此项目说明一下,我只完成了项目的基本需求,另外增加了一个用户反馈的功能,但是可能项目中间使用嗖嗖这个功能还有一些需要完善的地方,或者还有一些小bug,就当给大家参考一下了,希望谅解。代码我也上传…...
hcia复习笔记
一、OSI 七层模型 应用层:为应用程序提供服务,如文件传输、电子邮件等。 表示层:数据格式转换、加密解密、压缩解压缩。 会话层:建立、维护和管理会话。 传输层:提供端到端的可靠或不可靠的数据传输服务࿰…...
pycharm中安装、使用扩展工具,以QT Designer为例
pycharm中安装、使用扩展工具,以QT Designer为例 第一步,下载QT Designer安装包。找到QT Designer.exe所在位置,复制路径 第二步,打开Pycharm,选择Setting,找到扩展工具(External Tools…...
【Rust光年纪】Rust语言实用库汇总:从机器翻译到全文搜索引擎
优秀的Rust语言库探索:机器翻译、音频编解码和全文搜索引擎 前言 Rust语言在近年来迅速崛起,成为了一种备受欢迎的系统级编程语言。随着其生态系统的不断丰富,涌现出了许多优秀的库和工具。本文将重点介绍几个用于Rust语言的重要库…...
学习笔记 - 二极管的参数与选型
二极管 普通二极管: 1N4148(高频开关二极管) 整流二极管: 1N4007 1A 1000V1N5408 3A 1000V 肖特基二极管 (白线边为阴极) SS14 SS34 SS54 常见肖特基二极管参数 快恢复二极管 FR107 FR207 FR307 UF4007 可以用快恢复二…...
PMP--冲刺--易混概念
文章目录 十大知识领域一、整合管理项目管理计划与项目文件的区分: 二、范围管理三、进度管理赶工与快速跟进的区分:赶工增加资源,以最小的成本代价来压缩进度工期;快速跟进,将正常情况下按顺序进行的活动或阶段改为至…...
Resolving Maven dependencies
Maven是一种项目管理和构建工具,通常用于Java项目。这个过程包括下载项目所需的所有外部库和插件,并将它们添加到项目的构建路径中。具体来说,它正在处理名为“AAS_byBasyx”的项目或模块的依赖项。这种任务通常在你打开一个新的Maven项目或更…...
【Spring】SSM框架整合Spring和SpringMVC
目录 1.项目结构 2.项目的pom.xml文件 3.spring.xml和springMVC配置文件 4.database.properties和mybatis.xml配置文件 5. 代码编写 6.测试整合结果 1.项目结构 首先创建一个名为ssm_pro的Mavew项目,然后再在主目录和资源目录下,创建如下所示的结…...
优维2024年中思考:大模型赋予新一代运维的“非产品性”启示
近年来,人工智能在各个行业的应用大幅增加,人工智能技术取得重大进步的领域之一是IT运维。 去年四季度,优维科技敏锐地提出“新一代运维核心系统提供商”的战略新定位,决定将“DevOps及运维”回归到“运维”本身,但我…...
【中药网络药理学】筛选细胞衰老和预后相关基因(附分类代码和画图代码)
1、衰老相关基因 从HAGR和msigdb数据获取细胞衰老相关基因,将两者取交集后构建基因蛋白互作网络 HAGR数据库 该库本身提供了下载链接,我在下载后对其进行了清洗 msigdb数据库 以"aging"作为关键词,Search Filters中collection…...
华为的流程体系
缘由 2010年,华为销售额为1850亿元,其中国际市场占65%,净利润238亿元。当时,公司员工达11万人,公司处理合同达5万多个,290万个订单,大量的工作是手工处理,没有统一的流程支持&#…...
算法——长度最小的子数组209 对比代码随想录题解中对于result取值为Integer.MAX_VALUE的思考
具体解题过程可看代码随想录,我主要是对于为什么result也就是子数组和初始化要为Integer.MAX_VALUE有一个疑惑,为什么不是其他值,经过思考后我发现: 情况一:如果result为负数的话是不符合数组长度取值的一个规范的。 情况二&…...
图像处理案例03
HOGSVM数字识别 1 . 步骤2 . 代码 1 . 步骤 读入数据,把数据划分为训练集和测试集用hog提取特征用SVM训练数据测试、评价模型保存模型加载模型,应用模型 2 . 代码 import os import cv2 import sklearn import numpy as np from skimage.feature impo…...
【Kubernetes】k8s集群中kubectl的陈述式资源管理
目录 一.k8s集群资源管理方式分类 1.陈述式资源管理方式 2.声明式资源管理方式 二.陈述式资源管理方法 三.kubectl命令 四.项目生命周期 1.创建 kubectl create命令 2.发布 kubectl expose命令 3.更新 kubectl set 4.回滚 kubectl rollout 5.删除 k…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...
海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...
