重写equals就必须重写hashCode的原理分析

从“跳变”到“连续”:深入理解霍尔传感器插值与PLL角度估算的优劣与选择 本文深入解析霍尔传感器角度估算技术,对比线性插值法和锁相环(PLL)跟踪法的优劣,为电机控制领域的工程师提供实用指南。通过STM32F407和CubeMX的实例,详细探讨两种方法的实现细节、性能对比及优化策略,帮助在不同应用场景下做出最优选择。 阅读详情

文章转自:https://www.cnblogs.com/wang-meng/p/7501378.html

如果不被重写(原生Object)的hashCode和equals是什么样的?

  1.   不被重写(原生)的hashCode值是根据内存地址换算出来的一个值。
  2.   不被重写(原生)的equals方法是严格判断一个对象是否相等的方法(object1 == object2)。

为什么需要重写equals和hashCode方法?
      在我们的业务系统中判断对象时有时候需要的不是一种严格意义上的相等,而是一种业务上的对象相等。在这种情况下,原生的equals方法就不能满足我们的需求了
      所以这个时候我们需要重写equals方法,来满足我们的业务系统上的需求。那么为什么在重写equals方法的时候需要重写hashCode方法呢?

      我们先来看一下Object.hashCode的通用约定(摘自《Effective Java》第45页)

  1. 在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,那么,对该对象调用hashCode方法多次,它必须始终如一地返回 同一个整数。在同一个应用程序的多次执行过程中,这个整数可以不同,即这个应用程序这次执行返回的整数与下一次执行返回的整数可以不一致。
  2. 如果两个对象根据equals(Object)方法是相等的,那么调用这两个对象中任一个对象的hashCode方法必须产生同样的整数结果。
  3. 如果两个对象根据equals(Object)方法是不相等的,那么调用这两个对象中任一个对象的hashCode方法,不要求必须产生不同的整数结果。然而,程序员应该意识到这样的事实,对于不相等的对象产生截然不同的整数结果,有可能提高散列表(hash table)的性能。
     

 

如果只重写了equals方法而没有重写hashCode方法的话,则会违反约定的第二条:相等的对象必须具有相等的散列码(hashCode)。

同时对于HashSet和HashMap这些基于散列值(hash)实现的类。HashMap的底层处理机制是以数组的方法保存放入的数据的(Node<K,V>[] table),其中的关键是数组下标的处理。数组的下标是根据传入的元素hashCode方法的返回值再和特定的值异或决定的。如果该数组位置上已经有放入的值了,且传入的键值相等则不处理,若不相等则覆盖原来的值,如果数组位置没有条目,则插入,并加入到相应的链表中。检查键是否存在也是根据hashCode值来确定的。所以如果不重写hashCode的话,可能导致HashSet、HashMap不能正常的运作。

如果我们将某个自定义对象存到HashMap或者HashSet及其类似实现类中的时候,如果该对象的属性参与了hashCode的计算,那么就不能修改该对象参数hashCode计算的属性了。有可能会移除不了元素,导致内存泄漏。

接着来看一个代码片段:

运行这段代码发现结果返回的是null。

再来看一下HashMap中的get源码:

get的时候会先比较hashCode然后再去比较equals, 返回结果为null其实都是hashCode惹的祸。

以Java.lang.Object来理解, JVM每次new一个Object, 都会将Object丢到一个哈希表中去, 这样的话,下次做Object的比较或者取这个对象的时候, 它会根据对象的hashcode再从Hash表中取这个对象。这样做的目的是提高取对象的效率。

1.new Object(),JVM根据这个对象的Hashcode值,放入到对应的Hash表对应的Key上,如果不同的对象确产生了相同的hash值,也就是发生了Hash key相同导致冲突的情况,那么就在这个Hash key的地方产生一个链表,将所有产生相同hashcode的对象放到这个单链表上去,串在一起。

2.比较两个对象的时候,首先根据他们的hashcode去hash表中找他的对象,当两个对象的hashcode相同,那么就是说他们这两个对象放在Hash表中的同一个key上,那么他们一定在这个key上的链表上。那么此时就只能根据Object的equal方法来比较这个对象是否equal。当两个对象的hashcode不同的话,肯定他们不能equals.

 

华大 HC32F460 DMA数据传输实战:从配置到中断处理的完整指南 本文提供了华大半导体HC32F460微控制器DMA(直接内存访问)功能的完整实战指南。详细解析了DMA的配置流程、中断处理机制以及软件与硬件触发方式,并附有实验代码示例。通过合理使用DMA进行数据传输,可以显著解放CPU资源,提升嵌入式系统的实时性与运行效率。 阅读详情

相关推荐

Spring Cloud 整合(一) CRUD

Springcloud 整合之 CRUDSpringcloud介绍功能概述为什么要选用Springcloud Springcloud介绍 功能概述 实现微服务 Spring Cloud为开发人员提供了工具,以快速构建分布式系统中的某些常见模式(例如,配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式会话,群集状态)。分布式系统的协调导致样板式样,并且使用Spring Cloud开发人员可以快速站起来实现这些样板的服务和应用程序。 为什么要选用Springcloud

Kerwin-Lin的博客 1501

重写 equals() 时没有重写 hashCode() 方法的话,使用 HashMap 可能会出现什么问题。...

如果在重写了 equals() 方法后没有重写 hashCode() 方法,那么使用 HashMap 时可能会出现以下问题: 在查询元素时可能会出现查询不到元素的情况,即使使用的是正确的键。这是因为在使用 HashMap 时,会根据键的哈希值来查找元素,而如果没有重写 hashCode() 方法,那么每个对象的哈希值都会相同,导致 HashMap 无法准确地找到对应的元素。 如果在 HashM...

weixin_42601608的博客 1823

信息隐藏 数字图像空域隐写与分析技术的实现

【代码】信息隐藏 数字图像空域隐写与分析技术的实现。

Yungoal的博客 469

重写 equals() 时没有重写 hashCode() 方法的话,使用 HashMap 可能会出现什么问题

hashMap、HashSet在比较元素时,会先通过hashCode进行比较,相同的情况下再通过equals进行比较。 所以:equals相等的两个对象,hashCode一定相等 hashCode相等的两个对象,equals不一定相等(比如散列冲突的情况) 重写了equals方法,不重写hashCode方法时,可能会出现equals方法返回为true,而hashCode方法却返回false。这样的一个后果会导致在hashmap、hashSet等类中存储多个一模一样的对象,这与java的思想不符(因为:ha

Chennile的博客 5308

clumsy一款模拟弱网的工具

利用封装 Winodws Filtering Platform 的WinDivert 库, clumsy 能实时的将系统接收和发出的网络数据包拦截下来,人工的造成延迟,掉包和篡改操作后再进行发送。无论你是要重现网络异常造成的程序错误,还是评估你的应用程序在不良网络状况下的表现,clumsy 都能让你在不需要额外添加代码的情况下,在系统层次帮你达到想要的效果。

klb5555的专栏 2551

RT-2(robotics-transformer2)论文--阅读笔记

谷歌RT-2机器人论文的阅读笔记。

weixin_61255639的博客 1828

常见面试题(整理得比较好的)

常见面试题(整理得比较好的)

m0_59281987的博客 1953

基于PSIM仿真的单相全桥逆变电路

根据单极性SPWM调制电路、双极性SPWM调制电路和逆变器拓扑可以得到完整的逆变器仿真电路模型。

weixin_59329579的博客 1万+

重写 equals()时没有重写 hashCode()方法的话,使用 HashMap 可能会出现什么问题

使用HashMap时,根据hash值来查找元素,如果没有重写 hashCode(),此时调用的时object的hashCode方法,会导致每个对象的hash值都相同,导致在查找时,即使使用的是正确的键,在查询元素时可能会出现查询不到元素的情况。同时,如果在hash值都相同的情况下,插入大量的元素,就会导致hash碰撞的概率激增,使查找的效率降低。

qq_43795369的博客 856

OsgEarth开发笔记(三):Osg3.6.3+OsgEarth3.1+vs2019x64开发环境搭建(下)

上一篇编译了proj6.2.0、gdal3.2.1,本篇继续。 OsgEarth的编译,是基于Osg和OsgEarth结合在一起的,先要编译Osg,然后编译OsgEarth。OsgEarth的依赖库较多,分为上、中、下三篇,然后单独有一篇如何将编译好的osgEarth集成到Qt中。

长沙红胖子 Qt・西安|省级科研团队从业背景,深耕双一流体系高精尖技术配套研发|剥离高精尖机理,沉淀高端特种行业领域 Qt 工程化落地经验|博文仅分享通用技术总结,输出公开普适工程思路。 4万+

SQL的基本介绍

1.什么是数据库?2.什么是数据库管理系统?3.什么是 SQL?1.数据库是保存有组织的数据的容器,通常是一个文件或一组文件,可以将其看作电子化的文件柜。用户可以对文件中的数据执行新增、删除、更新、查询等操作。2.数据库管理系统是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户可以通过 DBMS 访问数据库中的数据,数据库管理员也可以通过 DBMS 进行数据库的维护工作。

shiwei0813的博客 2879

【编程进阶知识】 解锁HashMap的隐藏陷阱:深入探讨hashCode与equals方法的重要性

一、⭐⭐⭐何为内存泄漏???????????? 内存泄漏,指的是该对象在Java应用程序中的使命已经完结,该做的事情都已经做完了,对Java应用程序来说,已经没有继续存在的价值和意义了,可以被GC回收了。可偏偏GC无法对这个对象做回收处理。因为,该对象被错误的禁锢在了某个不知名不易被察觉的地方。 随着时间的流逝,这种因各种原因导致的内存泄漏而存在的无效对象会越来愈多,占用的内存就越大,就有可能会导致Java应用程序申请不到足够的内存空间,引发内存溢出。 二、⭐⭐⭐Object中的hashCode和equal

Dylaniou的博客 2833

【DRAM存储器五十四】LPDDR5介绍--PHY简介和LPDDR5训练流程

简述LPDDR5 PHY的基本功能和训练流程简介

highman110的博客 908

Java 重写equals就必须重写hashCode的原理分析

原文地址:https://www.cnblogs.com/wang-meng/p/7501378.html 因为最近在整理Java集合的源码, 所以今天再来谈谈这个古老的话题,因为后面讲HashMap会用到这个知识点, 所以重新梳理下。 如果不被重写(原生Object)的hashCode和equals是什么样的? 不被重写(原生)的hashCode值是根据内存地址换算出来的一个值。 ...

学习笔记 598

IEM模型,地表粗糙度模拟

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

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

重写equals必须重写hashcode吗?(原理分析)

重写equals 和 重写hashcode的必要性和原理分析 首先上Object类的源码: public native int hashCode(); public boolean equals(Object obj) { return (this == obj); } equals方法和hashcode方法是Object类的两个方法。 (1)equals()...

Jonsnow1457的博客 494

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java中Set存储元素的原理分析(自定义类为何需要重写equals和hashcode方法)

文章目录两个例子例1:集合中存储字符串例2:集合中存储自定义元素Set存储数据原理重写hashcode和equals方法重写equals方法的时候,必须重写hashcode方法 两个例子 集合的基本问题 例1:集合中存储字符串 下述代码输出什么? public static void main(String[] args) { Set<String> s...

超级无敌小胖头 854

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

重写equals就必须重写hashCode的原理分析(让你彻底理解为什么)

因为最近在整理Java集合的源码, 所以今天再来谈谈这个古老的话题,因为后面讲HashMap会用到这个知识点, 所以重新梳理下。 如果不被重写(原生Object)的hashCode和equals是什么样的?   不被重写(原生)的hashCode值是根据内存地址换算出来的一个值。   不被重写(原生)的equals方法是严格判断一个对象是否相等的方法(object1 == object2)。 ...

HD243608836的博客 328

重写hashcode和equals方法

一。前言 我们都知道,要比较两个对象是否相等时需要调用对象的equals()方法,即判断对象引用所指向的对象地址是否相等,对象地址相等时,那么与对象相关的对象句柄、对象头、对象实例数据、对象类型数据等也是完全一致的,所以我们可以通过比较对象的地址来判断是否相等。 二。Object源码理解 对象在不重写的情况下使用的是Object的equals方法和hashcode方法,从Object...

简乐君 7万+

Java基础面试之:重写equals()为什么重写hashcode()

重写equals为什么重写hashcode前言一、Object中的hashcode()和equals()hashcode()equals()二、HashMapequalshash总结注意: 前言 我们往往在编写业务程序时需要对一些类进行equals()方法的重写,其中常用的一种情况就是用来保证可以对这个类属性相同的对象作比较,还有String类中也会对equals进行重写。在重写equals时,我...

Wnliam的博客 722

Hashcode相等和equals相等的关系

Hashcode和equals 关系 以下都是除了特例以外:(如“AA” “Bb” 的hashcode都是2112) 1. equals相等 Hashcode不一定相等 1.1 若是equals方法未重写,比较的是堆中地址相等 ,则是同一个对象,hashcode不管重不重写都相等 1.2 若是equals方法重写,比较的是对象的成员变量值,equals相等有可能是堆中new了一个对象,地址不同, 所以hashcode若是没有重写,则根据地址算法不相等, 若是hashcode方法也重写了,则根据成员变量的h

cora_99的博客 4882

Java 重写equals()方法后重写 hashCode() 方法的必要性

Java API文档中的规定 如果两个对象通过调用equals方法是相等的,那么这两个对象调用hashCode方法必须返回相同的整数。 Object中equals方法 面试时很容易碰到的问题: equals方法与 == 运算符的区别, 许多人都会回答:equals比较的是对象的内容,而 == 比较的是对象的地址. 这种说法其实并不完全正确, 在 Object 类中 equals 方法的实现如下所...

谈谈1974 547
上一篇: mybatis配置文件自动提示的方法(Eclipse)
下一篇: Java设计模式【更新中...】
Marvin-Fox
博客等级 码龄11年 190粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值