java开发——为什么要重写equals()和hashCode()方法?

超实用!VS Code配置C/C++开发环境全攻略 本文提供了一份详细的VS Code配置C/C++开发环境全攻略。从MinGW-w64编译器的选择与安装,到VS Code核心扩展的配置,再到tasks.json构建任务与launch.json调试环境的设置,手把手指导初学者完成从环境搭建到高效开发与调试的全过程,帮助开发者快速上手C/C++项目。 阅读详情

结论:

1、重写equals()是为了实现自己的区分逻辑。

2、重写hashCode()是为了提高hash tables的使用效率,以及和equals()保持一致(看下面hashcode的第三点)。

举例:

1、String重写Object的equals方法

2、HashSet是如何保证存储的元素不同的?

 

首先明白这两个方法是什么来的?

equals()和hashCode()是Object的两个方法。作用有两个:

1、区分两个Object

2、给子类重写,让子类去实现自己的区分逻辑。

看下Object的源码是如何区分两个Object的。

public boolean equals(Object obj) {
     return (this == obj);
}

可以看出除了==this,否则两个对象不相同。

对于hashCode,源码注释中这样解释的:

1、它是一个代表Object的整数int值,它有利于哈希表的存储使用。(重要)

2、无论何时调用同一对象此方法,返回值都应是相同的。(equals用到的比较信息没有被修改的情况下)

3、如果equals()方法确定了两个对象相等,则这两个对象的hashCode必须返回相同的值(这点就可以决定重写equals()方法就必须重写hashCode方法了)

4、如果equals()方法确定了两个对象不相等,这个两个对象的hashCode还是有可能相等的。但是我们强烈建议不同的对象应该有着不同的hashCode,这样可以提高hash tables的使用效率。

综上,为什么要重写equals()和hashCode()方法的原因有两个:

1、重写equals()是为了实现自己的区分逻辑。

2、重写hashCode()是为了提高hash tables的使用效率。

下面是举例:重写的重要性

例子1:String重写Object的equals方法,源码如下:

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String) anObject;
            int n = count;
            if (n == anotherString.count) {
                int i = 0;
                while (n-- != 0) {
                    if (charAt(i) != anotherString.charAt(i))
                            return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

public int hashCode() {
        int h = hash;
        if (h == 0 && count > 0) {
            for (int i = 0; i < count; i++) {
                h = 31 * h + charAt(i);
            }
            hash = h;
        }
        return h;
    }

可以看出在重写equals()和hashCode()方法时,字符串中的每一个字符都用上了。这样,"abc"和"adcd"的hashCode肯定不相同。"abc".equals("abc")返回true是我们要的结果,符合我们区分逻辑。而不是像Object的equals方法那样“this == obj”引用相等才相同。所以String需要重写Object的equals方法。

例子2:HashSet是如何保证存储的元素不同的?

看下add方法,源码如下:

private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();

public boolean add(E e) {
     return map.put(e, PRESENT)==null;
}

可以看出,HashSet底层是依靠HashMap实现的,而我们知道,HashMap的键值是不可以重复的(可以为null)。重点来了,HashMap保证键值不重复就是依靠对象的equals()和hashCode()方法。

看HashMap的put方法部分伪代码:

1、key是新加入的对象
2、hash是key的哈希值
3、e是哈希表中的每一个元素
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
   1、新值覆盖旧值(这个都是同一个Object PRESENT = new Object();)
   2、返回旧值
}
否则新增新的结点存储新值。

可以看出,在HashMap新增key-value的时候,如果hashCode和equals都相同,HashMap不会新增新的结点存储新值。而是在原来的key上覆盖掉value值。那么对于HashSet来说,也就是没有新增元素,因为HashSet的元素来源于HashMap的key集合。

 也就是说HashSet保证存储的元素的不同,是通过equals()和hashCode()方法来保证的。这就是为什么我们要重写equals()和hashCode()方法的重要原因之一。

补充:对于equals不相同而hashCode相同的元素集合,在哈希表中会以链表或者红黑树的形式储存!

 

觉得有用的老铁们赞一下,谢谢!

龙芯2K1000 OTG双模驱动深度解析 是Synopsys公司开发的USB 2.0 OTG控制器IP核,龙芯2K1000内置该IP,作为唯一的OTG控制器(PCI Dev4 Func0),物理基地址0x40000000。核心能力:同时支持Host主机模式(接U盘/键盘)、Device设备模式(虚拟串口ttyGS0)、OTG双模自动切换速率驱动路径:内核源码PMON:启用otg0设备树内核:开启HOSTPERIPHERALG_SERIAL启动参数脚本:sysfs角色切换+开机自启Host按以上配置,龙芯2K1000 DWC2 OTG可完美实现。 阅读详情

相关推荐

ubuntu24.04+RTX5090D 显卡驱动安装

本文详细介绍了在Ubuntu系统中更新内核、安装NVIDIA驱动的步骤。首先,通过mainline工具安装新版内核,并确保GCC版本兼容。接着,在无桌面环境下配置TTY模式,解决中文显示问题。然后,禁用默认的nouveau驱动,安装NVIDIA驱动,并选择开源驱动以避免黑屏问题。最后,重新启用图形界面,并通过测试软件验证显卡功能。整个过程涵盖了内核更新、驱动安装、TTY配置及图形界面恢复等多个关键步骤,适合需要手动配置NVIDIA驱动的用户参考。

妖米的博客 4675

为什么要重写hashCode()和equals()

从源码的角度,介绍hashCode()和equals()函数的作用,解释为什么需要重写,什么时候需要重写,具体应该怎么重写。

LYQ20010417的博客 4904

过压保护电路(OVP)

作者:AirCity 2020.2.4 Aircity007@sina.com 本文所有权归作者Aircity所有 1 示例一 当VBUS=5V时,各点电压电流如图所示,Q1接近截止,输出信号是5V。 当VBUS=5.4V开始,输出信号开始下降,直到VBUS=6.1V,输出信号降低为0.6V。 下面是实测波形,这个电路,输出信号的电压不会超过5.4V,这个输出信号可用于电源的控制信号。 2 ...

AirCity123的博客 3万+

通俗解释——为什么要重写hashCode()和equals()方法

目录 一、通俗解释 二、案例说明 三、总结 一、通俗解释 无论是对于初学者还是面试,这个问题都是一个经典。我们这里使用通俗易懂也就是俗称的“说人话”来解释为什么要重写hashCode()和equals()方法。 首先,以HashMap为例,我们简单了解一下其内部结构。HashMap底层采用了数组+链表的构造,其中jdk1.8开始还使用了红黑树。简图如下: HashMap中每个单元位置都是一个Entry,又称为桶(bucket),其中jdk1....

flesaca的博客 2722

Rstudio安装org.Hs.eg.db

自己也是个小白,初次安装org.Hs.eg.db碰到好多问题,步骤总结如下: 第一,instal.packages()安装,不行则换 BiocManager::install() 第二,如BiocManager不成,说明不是最新版本,可按提示安装最新版 BiocManager::install(version = '3.13') #由于R版本较新,按照提示中的相关信息,安装最新版本的 第三,再次安装 BiocManager::install("org.Hs.eg.db") 第四,之后每个人.

ZH_DDong的博客 2万+

ITK-snap进行分割区域标注、三维显示及改变显示颜色

在进行医学图像器官分割时,无论我们是用传统方法还是深度学习,最后肯定要用到手动分割的区域作为金标准来验证我们方法的精度。但是手动标注器官的轮廓是十分耗时的,这里我介绍一个比较简单的标注方法,以肺分割作为例子。 我们使用ITK-snap作为分割标注工具。 当切片间距离比较小时,比如1mm,一个患者的完整HRCT序列通常在200张以上,如果让医生一一进行分割区域标注是非常耗时乏味的。因此,我们可以使用最简单的阈值法比如OSTU,加上基本的形态学操作对肺进行粗分割得到粗略的分割掩码,在此基础上再手动的对分割结果进

u010409517的博客 2万+

为什么要同时重写equals方法和hashCode方法(详解)

首先,我们在作比较时,通常调用equals方法来比较(这里指Object类中的equals方法),比较俩个对象的地址值是否一样,地址值相同,则俩个对象相同。地址值不同,则俩个对象不同。 在这里,其实有个问题:当我们向一个集合中插入了一个对象,并且这个集合中有几万条数据,那我们还和之前一样,调用它的equals方法来比较俩个对象是否相等嘛? 当然,可以是可以,但效率必然是个问题。那么在考虑效率的情况下,如何去比较俩个对象是否相等呢,这个时候就用到了hashCode方法。hashCode方法是按照一定的规则将与

小情歌的博客 1万+

UI渲染顺序:合批为何被拆碎?

在 Hierarchy 中,避免出现:Image(列表1) → Text(列表1) → 特效 → Image(列表2) → Text(列表2)…若可行,在逻辑上把布局组织成“同类元素集中”:例如:列表行中,Image 集中、Text 集中;或者接受 Text 本身就拆出一批,关键是不要在 Text 中间再插入别的材质。现实中不一定能做到完美的“所有 Image 连在一起”,但你会有一个意识:同一 Canvas 内,如果你把不同材质的元素交错穿插,

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 85

hashCode() 方法有什么作用呢?

一.引言 首先 hashCode() 方法被设计在 Object 类中,说明是希望所有的对象都能实现该方法,该方法是会返回一个对应于当前对象的一个整数,之所以所有对象都实现该方法是为了将来对象在查找时变得快捷。 Java中的集合类 hashMap、hashSet 底层的实现都是哈希表,之所以采用哈希表,是因为他能克服链表和二叉树等数据结构在查询上的低效率问题,哈希表的存储就是根据对象的哈希值,以...

HU1656的博客 2670

机器人控制算法九之 位姿描述与空间变换

机器人控制算法九之 位姿描述与空间变换

yohnyang的博客 1032

ABAP Module Pool 编程入门:把 Table Control 用透,在 Dynpro 里做出可编辑的列表界面

摘要:Table Control是SAP GUI中用于对话式事务的多行数据交互控件,具备滚动、选择、修改等功能。它通过CXTAB_CONTROL/CXTAB_COLUMN结构实现动态控制,需在PBO/PAI中配合LOOP循环处理数据流。开发时需注意LINES、TOP_LINE等关键字段设置,并采用并行循环简化编码。典型应用包括订单行维护、主数据管理等场景,支持多选删除、列排序等业务需求。(150字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 343

Java中为什么重写Equals方法要重写HashCode方法

为了提高效率,采取重写hashcode方法,先进行hashcode比较,如果不同,那么就没必要在进行equals的比较了,这样就大大减少了equals比较的次数

qq_45830276的博客 2071

【微服务】SpringBoot 对接飞书审批流程使用详解

SpringBoot 对接飞书审批流程使用详解

congge_study的博客 3771

JAVA中重写equals()方法的同时要重写hashcode()方法

object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true; 注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定...

测试0901-1 131

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

equals方法与hashcode方法的重写

很显然,输出的结果无论是用的==比较还是用的equals比较都是false;散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的。经过哈希表达式计算后的hashcode相等的实在不好找,就不敲代码测试了,欸嘿~当发生冲突时,对应的存储单元以链表的形式保存冲突的数据(链地址法)。常见的散列表实现方式:用数组作为哈希函数的输出域,引用类型的变量所指向的对象的地址。

SuYuewu的博客 1911

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

为什么重写 equals 还要重写 hashCode 方法?

(1)如果两个对象的 hashCode值相等的情况下,对象的内容值不一定相等(hash碰撞问题) (2)如果使用 equals 方法比较两个对象内容值相等的情况下,则两个对象的hashCode值一定要相等

金鳞踏雨 855

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

为什么重写equals()一定要重写hashCode()呢

为什么重写equals()一定要重写hashCode()呢?

qwwee123的博客 190

【JavaSE】重写equals()和hashCode()

重写equals()方法实现比较对象的内容是否相等 为了保证“用equals()方法判断相等的对象,hashCode()也相等”,必须重写hashCode()方法。

weixin_42904738的博客 243

Java面试-hashCode() 和 equals() 为什么必须成对重写

场景推荐做法自定义类必须成对重写equals()和hashCode()字段选择使用final、不可变字段作为依据代码生成用 IDE 或 Lombok 自动生成比较内容用安全处理null生成哈希用集合使用确保重写后,对象能在HashSetHashMap中正常工作equals()相等 ⇒hashCode()必须相等。hashCode()是equals()的“向导”,不能失联。用和,少写 bug。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

hashcode是什么意思_为什么重写 equals() 方法,一定要重写 hashCode() 呢?| HashMap

首先我们有一个假设:任何两个 object 的 hashCode 都是不同的。 那么在这个条件下,有两个 object 是相等的,那如果不重写 hashCode(),算出来的哈希值都不一样,就会去到不同的 buckets 了,就迷失在茫茫人海中了,再也无法相认,就和 equals() 条件矛盾了,证毕。 撒花~~ 接下来我们再对这两个方法一探究竟: 其实 hashCode() 和 equ...

weixin_39621044的博客 189

java开发:为什么重写Object的equals()必须要重写hashCode()

在开始讨论标题这个问题之前我们先搞清楚几个概念: 1.基本数据类型和引用类型 我们知道java数据类型一般有俩大类,第一种基本数据类型,第二种引用类型。基本数据类型是没有引用这个概念的,例如 int a = 1,a 是直接存放在堆栈中直接指向它的内容。而平时我们使用的User user = new User(),我们创建的对象是保存在堆中,user是引用类型,它保存在堆栈中,保存的内容是User...

一个程序员-二白的博客 524

java中重写equals()方法的时候为什么要重写hashCode()方法?

有时候,或许会听到被人说,在重写equals方法的时候,记得重写hashcode方法。那么自然有这样的疑问,那么为什么这样?equals方法和hashCode方法是什么关系?不重写的时候会有什么危害?文章将从一下几个方面进行叙述。 一:什么是hashCode(),equals()方法? 二:hashCode(),equal()s两种方法是什么关系? 三:为什么在重写equals方法的

南瓜灯cc 3万+

为什么重写equals()就一定要重写hashCode()方法?

如果涉及使用对象作为key,那么key的对象都必须实现hashCode和equals方法。hashCode和equals方法持续自根类Object,若是你用自定义的类算作key的话,就需要同时覆写equals办法和hashCode方法,因为我们java的集合中判断两个对象是否相等,是根据hashCode和equals这个俩个方法。规则是先判断两个对象的hashCode是否相等,如果不相等,认为两个对

sixingmiyi39473的博客 7838

为什么重写equals()时一定要重写hashCode()?

equals()的时一定要重写hashCode 如:String a = "123456",String b = "123456",在 equals 方法看来,两个字符串的内存地址不相等,所以仍然会判定为不相等,所以需要去重写 equals 方法,只有重写了equals 方法之后,我们再去判断 a 和 b,此时判断结果就会相等。equals()和 hashCode()是 Object 类中的两个基础方法,Object 中的 equals( )和hashCode( ),使用==判断,即比较两个对象的地址值。

m0_64422133的博客 2571

关于为什么要重写hashCode()方法和equals()方法及如何重写

我想写的问题有三个: 1、首先我们为什么需要重写hashCode()方法和equals()方法 2、在什么情况下需要重写hashCode()方法和equals()方法 3、如何重写这两个方法 ********************************************************************* 第一个问题:为什么需要重写hashCode()方法和equ

jing_bufferfly的博客 1万+

为什么要重写equals()方法 和 hashCode()方法

Equals 和 HashCode方法是属于Object的,所以每个对象都有自己的equals 和 HashCode方法 为什么要重写equals()方法 1、equals()默认是比较的对象地址(源码见下图),而不是比较的对象的属性值,不符合我们的期望。 特别指出八大包装对象(如int,float等对应的包装类)和String类已重写了equals和hashcode方法,默认比较的是值 ...

【小石头的茅坑】 71万+
上一篇: java开发——enum枚举单例的使用
下一篇: java开发——Cloneable接口、clone()方法和深浅拷贝
river66
博客等级 码龄8年 76粉丝 108原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值