【耀杨闯荡华儿街】当曹阿门问起hascode()和equals()方法“上篇”

1年前 (2023) 程序员胖胖胖虎阿
130 0 0

👏作者简介东星耀杨,C站煮播之星,【无规则教学】创始人,曾奉太上老君之名下凡,为了给迷途中的兄弟萌指点迷津帮助兄弟萌早日踏入如我这般境界!世人见我,皆称之“王霸之气侧漏”的男人,哇靠蒸滴c!c了兄弟萌!
【耀杨闯荡华儿街】当曹阿门问起hascode()和equals()方法“上篇”
👏往期回顾
💌【耀杨的罗曼史】小红:耀杨欧巴,能教教我hashmap吗?【雀氏润】
💌【耀杨闯荡华儿街】(面试官)曹阿门:给我讲讲多线程;耀杨:md心态崩了
💌【耀杨闯荡华儿街】简述printf(“Hello World“)的运行原理——《曹阿门面试经典》
👏耀杨和兄弟萌的约定:等我到一千粉,给兄弟萌发红包!感谢兄弟萌的陪伴和支持!
👏目录下面奉上本人靓照

《 哇靠!知道我是谁嘛~》

  • 《不想让我的宝贝担惊受怕》
    • <小粉丝提问>
  • 神秘的Hash
    • Hash到底是什么呢?
      • hash函数与hash算法
      • hash值和hash表
  • Hashcode其实很好理解
    • Hashcode究竟是什么?
      • 物理地址
      • hashcode代表对象的位置
    • Hashcode用来干什么?
  • equals和hashcode方法的联系
  • 《哇靠shy老师:exclamation::exclamation::exclamation:》


【耀杨闯荡华儿街】当曹阿门问起hascode()和equals()方法“上篇”

《不想让我的宝贝担惊受怕》

兄弟萌兄弟萌,好想你们!!!🔥🔥🔥

耀杨主动承认错误,已经好几天没有更新博客了,不是耀杨不想更新,蒸滴是事出有因,上次由于兄弟萌的热情导致新来的樱花小键得了严重的键周炎,MD心疼死了呢,特此休息了几天以免小键的情绪再次激动,我怕我会把持不住兄弟萌,你们懂的~爱你萌。
【耀杨闯荡华儿街】当曹阿门问起hascode()和equals()方法“上篇”

<小粉丝提问>

没错就是今天,有个hxd来问耀杨秃头了没,感觉不对劲后,又问耀杨的头发还好吗?在这里我想问问大家编程久了蒸滴会掉头发吗?我感觉我天天熬夜头发不减反而越来越多……诶嘿,有没有兄弟头秃的,传授传授我掉头发的秘诀(期待)。

【耀杨闯荡华儿街】当曹阿门问起hascode()和equals()方法“上篇”

好了好了,以上都是每天的小骚话时间,下面也要认真教学了!兄弟萌都打起精神了,不然揍你诶嘿,我掏一下就跑诶嘿!

神秘的Hash

哇靠,我耀杨是蒸滴没想到曹阿门这个大眼的碧池会问道这个问题,让我说说java Object类中的Hashcodeequals方法。

哇靠兄弟们我被坑了,必须给兄弟萌讲清楚。耀杨先从Hash讲起。

Hash到底是什么呢?

在这里耀杨引入几个概念:

hash函数

hash算法

hash值

hash表

hash函数与hash算法

Hash其实是一个函数的概念,Hash函数的实现就是Hash算法。

常用的Hash函数中包括直接取余法、乘法取整法以及平方取中法。本文耀杨不主要讲解这些Hash函数,而Hash算法是用来干什么的呢?

hash值和hash表

通过Hash算法以及一系列算法可以得到一个Hash值,这时候兄弟萌就问了,Hash值又是什么?

  • 在这里兄弟萌需要了解Hash表,通过Hash函数实现的算法得到Hash值存放在Hah表中。

好了兄弟萌,有关Hash知道这么多就可以了,接下来就到了今天的重头戏Hashcode。

曹阿门这时候又要开口说些什么,我一把按住他的嘴,

“不要再狗叫了!!!不要影响我给兄弟萌教学!!!”

Hashcode其实很好理解

不要着急否认,肯定有兄弟跟我一样,在刚开始学的时候,一看到什么Hash前缀的就发蒙,其实完全没有必要,一定不要慌,来康康耀杨,心情愉悦还能学到知识诶嘿!
【耀杨闯荡华儿街】当曹阿门问起hascode()和equals()方法“上篇”

在这里耀杨崽再次引入两个概念:

1. 物理地址

2. hashcode代表对象的地址

Hashcode究竟是什么?

简单来说,Hascode是通过Hash算法得到的,在hash表中有其对应的位置。

  • 每个对象都有着其物理地址,物理地址可以被转换为一个整数,该整数通过一定的hash算法可以得到hashcode,此时就得到了该对象在hash表中的位置。

  • 在hash表中有hashcode的十个位置,分别是一到十。当一个对象S被存入内存,转化为一个对应整数,通过算法可以转化为一个确定的Hashcode值,所以对象S在Hash中的位置就是该Hashcode值与原Hash表中Hashcode值对应的位置。

物理地址

兄弟萌需要搞清楚一个概念:物理地址就是对象在内存中的位置。

hashcode代表对象的位置

hashcode代表对象的位置就是对象在hash表中的位置。

Hashcode用来干什么?

好多兄弟萌私信耀杨为什么不直接用物理地址呢?hashcode 的引入到底有什么用?
【耀杨闯荡华儿街】当曹阿门问起hascode()和equals()方法“上篇”

⭐️在计算机的世界中,数据量无疑是巨大的,如果都是通过简单的依次遍历来实现对象的查询,这样的方法无疑是低效的。

这时候聪明的人们就想出了一个好办法,将对象物理地址的值转换为整数,并且计算出hash值,存放到相同值的hash表中的hashcode位置。

⭐️也就是说当你在hash表中存放了1000个数据时,这些数据会根据hash算法的得到的hash值存放到相应的hashcode位置。

当然hashcode位置可能不止一个数据,但是这样的查找方式就不用一个个数据进行比对了,速率当然会加快了!!

⭐️ 这就相当于我们在学校中一个个找和分班找差不多,而每个同学分配到哪个班级都是系统特定算法计算的,这个时候我们想要****查找这个同学,只需重新计算他所在的班级,然后进入班级中比对。

在班级中比对的过程就涉及到了equals方法。

equals和hashcode方法的联系

【耀杨闯荡华儿街】当曹阿门问起hascode()和equals()方法“上篇”

1.equals 判断的是两个对象的引用指向的是不是同一个对象;
2.hashcode是根据对象地址生成一个整数数值;

3.等价的两个对象的hashcode一定相等,而hashcode相等的两个对象不一定等价。

4.hashcode相等只能说明两个对象在散列存储结构中除以同一位置。

由于上面的方法,我们必须要提到的是:

我们在重写了equals方法后,尽量也重写了hashcode方法,通过一定的算法,使他们在equals相等时,也会有相同的hashcode值。

有关于equals与“==”的比较,如何进行equals以及hashcode方法的重写将于下篇为兄弟萌深入讲解。

《哇靠shy老师❗️❗️❗️》

【耀杨闯荡华儿街】当曹阿门问起hascode()和equals()方法“上篇”

兄弟萌今天也不想这么早结束的,可是我shy老师今天三场mvp,我耀杨必须奖励自己了嘿哈

今天依旧是爱你萌的耀杨!!!

相关文章

暂无评论

暂无评论...