首页
技术博客
PHP教程
数据库技术
前端开发
HTML5
Nginx
php论坛
新用户注册
|
会员登录
PHP教程
技术博客
编程问答
PNG素材
编程语言
前端技术
Android
PHP教程
HTML5教程
数据库
Linux技术
Nginx技术
PHP安全
WebSerer
职场攻略
JavaScript
开放平台
业界资讯
大话程序猿
登录
极速注册
取消
热门标签 | HotTags
usb
main
random
jar
web3
substring
chat
hashset
string
regex
iostream
client
format
window
heap
replace
python3
spring
controller
heatmap
metadata
js
int
cPlusPlus
httprequest
rsa
audio
bytecode
range
filter
blob
php7
lua
testing
数组
perl
yaml
function
utf-8
jsp
text
cmd
go
cpython
sum
future
dockerfile
java
typescript
merge
settings
frameworks
loops
php8
callback
const
input
require
php5
c语言
dll
timestamp
timezone
list
solr
byte
bit
io
import
plugins
bash
process
shell
subset
httpclient
tags
instance
case
post
当前位置:
开发笔记
>
编程语言
> 正文
重写equals就必须重写hashCode的原理分析
作者:手机用户2502897401 | 来源:互联网 | 2023-05-17 18:07
因为最近在整理Java集合的源码,所以今天再来谈谈这个古老的话题,因为后面讲HashMap会用到这个知识点,所以重新梳理下。如果不被重写(原生Object)的hashCode和equals是什么样
因为最近在整理Java集合的源码, 所以今天再来谈谈这个古老的话题,因为后面讲HashMap会用到这个知识点, 所以重新梳理下。
如果不被重写(原生Object)的hashCode和equals是什么样的?
不被重写(原生)的hashCode值是根据内存地址换算出来的一个值。
不被重写(原生)的equals方法是严格判断一个对象是否相等的方法(object1 == object2)。
为什么需要重写equals和hashCode方法?
在我们的业务系统中判断对象时有时候需要的不是一种严格意义上的相等,而是一种业务上的对象相等。在这种情况下,原生的equals方法就不能满足我们的需求了
所以这个时候我们需要重写equals方法,来满足我们的业务系统上的需求。那么为什么在重写equals方法的时候需要重写hashCode方法呢?
我们先来看一下Object.hashCode的通用约定(摘自《Effective Java》第45页)
在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,那么,对该对象调用hashCode方法多次,它必须始终如一地返回 同一个整数。在同一个应用程序的多次执行过程中,这个整数可以不同,即这个应用程序这次执行返回的整数与下一次执行返回的整数可以不一致。
如果两个对象根据equals(Object)方法是相等的,那么调用这两个对象中任一个对象的hashCode方法必须产生同样的整数结果。
如果两个对象根据equals(Object)方法是不相等的,那么调用这两个对象中任一个对象的hashCode方法,不要求必须产生不同的整数结果。然而,程序员应该意识到这样的事实,对于不相等的对象产生截然不同的整数结果,有可能提高散列表(hash table)的性能。
如果只重写了equals方法而没有重写hashCode方法的话,则会违反约定的第二条:相等的对象必须具有相等的散列码(hashCode)。
同时对于HashSet和HashMap这些基于散列值(hash)实现的类。
HashMap的底层处理机制是以数组的方法保存放入的数据的(Node
[] 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.
hash
hashcode
java
object
程序员
数组
get
jvm
key
写下你的评论吧 !
吐个槽吧,看都看了
会员登录
|
用户注册
推荐阅读
int
如何正确的实现Java中的hashCode方法
你知道一个对象的唯一标志不能仅仅通过写一个漂亮的equals来实现太棒了,不过现在你也必须实现hashCode方法。让我们看看为什么和怎么做才是正确的。相等和哈希码相等是从一般的方面 ...
[详细]
蜡笔小新 2023-06-07 17:40:08
int
Java HashMap实现原理0——从hashCode,equals说起
Java集合类中常见的hashSet,hashMap,hashTable(现已很少用,几乎都采用hashMap替代)的实现都离不开散列表,而散列表的优势在于O(1)级别的查找,而has ...
[详细]
蜡笔小新 2023-06-08 12:50:11
int
JDK源码学习之HashTable(附带面试题)的学习笔记
本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ...
[详细]
蜡笔小新 2023-12-12 13:05:17
int
Java面经整理及相关概念解析
本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ...
[详细]
蜡笔小新 2023-12-10 22:17:08
int
HashMap的相关问题及其底层数据结构和操作流程
本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ...
[详细]
蜡笔小新 2023-12-10 17:07:36
int
如何确保hashCode()与equals()一致? - How to ensure hashCode() is consistent with equals()?
Whenoverridingtheequals()functionofjava.lang.Object,thejavadocssuggestthat,当重写java.lang. ...
[详细]
蜡笔小新 2023-07-06 14:34:06
int
Java中equals()与hashCode()的原理与设计
1.何时需要重写equals()当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。2.为什么改写equals()的时候,总是要改写hashCode()两个原则:hashCode()的返回& ...
[详细]
蜡笔小新 2023-06-24 15:48:40
int
黑马程序员_HashCode与equals
-------------------------------------------------android培训、java培训期待与您交流!--------------------------- ...
[详细]
蜡笔小新 2023-06-10 15:49:23
int
HashMap深度解析(一)
本文来自:高爽|Coder,原文地址:http:blog.csdn.netghsauarticledetails16843543,转载请注明。HashMap可以 ...
[详细]
蜡笔小新 2023-05-29 09:02:25
int
[java] 为什么重写equals()必须要重写hashCode()
本文版权归远方的风lyh和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作。在JavaAPI文档中关于hashCode方法有以下几点规定(原文来自java深入解析一书) ...
[详细]
蜡笔小新 2023-05-28 16:43:33
int
为什么这个hashCode()方法被认为很差?
如何解决《为什么这个hashCode()方法被认为很差?》经验,为你挑选了1个好方法。 ...
[详细]
蜡笔小新 2023-05-28 14:56:12
int
【J2SE】hotspot中如何实现Object.hashCode
本文目录 一、基本概念二、hotspot的实现Object.hashCode()markwordget_next_hash(thread,obj)System.identityHa ...
[详细]
蜡笔小新 2023-05-26 14:42:28
int
什么是HashCodeBuilder和EqualsBuilder,用于覆盖hashcode()和equals()方法?
如何解决《什么是HashCodeBuilder和EqualsBuilder,用于覆盖hashcode()和equals()方法?》经验,为你挑选了1个好方法。 ...
[详细]
蜡笔小新 2023-05-25 18:36:42
js
mongodb数据迁移,程序员未来职场之路
一面自我介绍对象相等的判断,equals方法实现。可以简单描述挫折,并说明自己如何克服,最终有哪些收获。职业规划表明自己决心,首先自己不准备继续求学了,必须招工作了。希望去哪 ...
[详细]
蜡笔小新 2023-10-17 13:57:50
int
Java HashSet包含无法正常工作的函数
如何解决《JavaHashSet包含无法正常工作的函数》经验,为你挑选了1个好方法。 ...
[详细]
蜡笔小新 2023-05-27 11:10:10
手机用户2502897401
这个家伙很懒,什么也没留下!
Tags | 热门标签
usb
main
random
jar
web3
substring
chat
hashset
string
regex
iostream
client
format
window
heap
replace
python3
spring
controller
heatmap
metadata
js
int
cPlusPlus
httprequest
rsa
audio
bytecode
range
filter
RankList | 热门文章
1
matlab里面bin图像读取,matlab 实践程序3——实现读写.bin二进制文件(ciafr10图片的逆置)...
2
mysql 索引 不等号_MySql中不等号的一点疑问:从为什么不等号有时也会用到索引说到“覆盖索引” | 学步园...
3
重学之路---位运算和(逻辑和短路)的与或
4
Java精通并发volatile与内存屏障的重要语义详细分析
5
手把手教你用深度学习做物体检测(四):模型使用
6
使用php通过smtp发送邮件新手指南_php
7
JQuery插件写法总结
8
vac服务器未响应,win7玩csgo官方匹配提示vac无法验证您的游戏会话怎么办
9
[转]ASP.NET 缓存(十八)从缓存中删除项时通知应用程序
10
记一次git的版本回退
11
Firefox 84 将完全停止对 Flash 的支持
12
为什么
的上外边距在图上显示的比下外边距小呢?
13
+= 和 =+ 的区别
14
使用 Matplotlib 在 Python 中绘制三维线框
15
Go语言入门教程介绍和安装
PHP1.CN | 中国最专业的PHP中文社区 |
DevBox开发工具箱
|
json解析格式化
|
PHP资讯
|
PHP教程
|
数据库技术
|
服务器技术
|
前端开发技术
|
PHP框架
|
开发工具
|
在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved |
京公网安备 11010802041100号
|
京ICP备19059560号-4
| PHP1.CN 第一PHP社区 版权所有