文档章节

重写equals方法时重写hashcode方法的必要性

 最胖的瘦子
发布于 04/07 11:46
字数 615
阅读 4
收藏 0

首先明确一点,我们现在用的equals方法都是string重写过的,而并非原生的object类下的。

 

那如果重写了equals方法,而没有重写hashcode方法会出现什么情况呢?

如果重写了equals方法,那么可以确保两个比较对象的属性是相同的,那么此时如果未重写hashcode方法,由于hashcode比较是内存地址是否相同,那么此时不重写hashcode方法的话,会使用原生的object类下的hashcode方法,那两个比较对象的内存地址肯定是不同的,这显然是不符合规则。

 

所以重写equals方法的时候,必须保证重写hashcode方法

1. 如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同!!!!;

2. 如果两个对象不同(即用equals比较返回true),那么它们的hashCode值可能相同也可能不同;(重写equals方法,未重写hashcode情况下)

3. 如果两个对象的hashCode相同(存在哈希冲突),那么它们可能相同也可能不同(即equals比较可能是false也可能是true)

4. 如果两个对象的hashCode不同,那么他们肯定不同(即用equals比较返回false)

 

 

想一下若是重写了equals方法,但未重写hashcode方法的话,在实际应用中带来的严重后果

以hashset举例,我们都知道hashset存储的是无序不重复的对象,那他是如何实现的?

首先通过equals方法判断两个对象是否相等,然后根据调用两个对象的hashcode方法得到他们的hashcode值。如果此时只重写了equals方法,而未对hashcode方法重写,那么结果就是比较后发现两者的内存地址不同,认为这是两个不同的对象,然后存储的时候就会都存储进来,并且存储在不同的位置。这就不符合了hashset的原则了。出现了两个相同的对象

© 著作权归作者所有

粉丝 4
博文 34
码字总数 19079
作品 0
杭州
私信 提问
重写equals方法后重写hashCode方法的必要性

1、首先我们看看对象默认的(Object)的equals方法和hashcode方法 public booleanequals(Object obj) { return(this== obj); } public native inthashCode(); 对象在不重写的情况下使用的是O...

长河
2018/10/31
0
0
java重写equals()方法和hashCode()方法

1.equals()方法和hashCode()方法是什么? equals()和hashCode()都是是Java中万物之源Object类中的方法; equals方法用于比较两个对象是否相同,Object类中equals方法的实现是比较引用地址来判...

天王盖地虎626
06/19
43
0
hashcode()和equals()的是是非非

我们在很多博客的文章当中,我们都看到这样一句话:在重写equals方法的同时一定要重写hashCode方法。这是为什么?很多人会说,我的业务代码,只用equals比较比较两个对象是否相等不就可以了,...

似是而非Sage
2016/08/18
60
0
hashcode和equals

若两个对象equals相等(重写了equals方法),但不在一个区间(没有重写hashcode方法),因为hashCode的值在重写之前是对内存地址计算得出,所以根本没有机会进行比较,会被认为是不同的对象。所...

WJobs
2018/06/15
16
0
equals和hashCode的区别和联系

一、前言 前段时间使用list.remove(obj)的时候重写了obj的equals方法,因为list的remove是以equals来判断标准的。但是,今天被公司的代码扫描工具提示未重写hashCode方法!!之前准备面试时也...

叫我宫城大人
2017/08/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
1K
13
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
38
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部