👏作者简介:东星耀杨,C站煮播之星,【无规则教学】创始人,曾奉太上老君之名下凡,为了给迷途中的兄弟萌指点迷津,帮助兄弟萌早日踏入如我这般境界!世人见我,皆称之“王霸之气侧漏”的男人,哇靠蒸滴c!c了兄弟萌!
👏往期回顾:
💌【耀杨的罗曼史】小红:耀杨欧巴,能教教我hashmap吗?【雀氏润】
💌【耀杨闯荡华儿街】(面试官)曹阿门:给我讲讲多线程;耀杨:md心态崩了
💌【耀杨闯荡华儿街】简述printf(“Hello World“)的运行原理——《曹阿门面试经典》
👏耀杨和兄弟萌的约定:等我到一千粉,给兄弟萌发红包!感谢兄弟萌的陪伴和支持!
👏目录下面奉上本人靓照
《 哇靠!知道我是谁嘛~》
- 《不想让我的宝贝担惊受怕》
-
- <小粉丝提问>
- 神秘的Hash
-
- Hash到底是什么呢?
-
- hash函数与hash算法
- hash值和hash表
- Hashcode其实很好理解
-
- Hashcode究竟是什么?
-
- 物理地址
- hashcode代表对象的位置
- Hashcode用来干什么?
- equals和hashcode方法的联系
- 《哇靠shy老师:exclamation::exclamation::exclamation:》
《不想让我的宝贝担惊受怕》
兄弟萌兄弟萌,好想你们!!!🔥🔥🔥
耀杨主动承认错误,已经好几天没有更新博客了,不是耀杨不想更新,蒸滴是事出有因,上次由于兄弟萌的热情导致新来的樱花小键得了严重的键周炎,MD心疼死了呢,特此休息了几天以免小键的情绪再次激动,我怕我会把持不住兄弟萌,你们懂的~爱你萌。
<小粉丝提问>
没错就是今天,有个hxd来问耀杨秃头了没,感觉不对劲后,又问耀杨的头发还好吗?在这里我想问问大家编程久了蒸滴会掉头发吗?我感觉我天天熬夜头发不减反而越来越多……诶嘿,有没有兄弟头秃的,传授传授我掉头发的秘诀(期待)。
好了好了,以上都是每天的小骚话时间,下面也要认真教学了!兄弟萌都打起精神了,不然揍你诶嘿,我掏一下就跑诶嘿!
神秘的Hash
哇靠,我耀杨是蒸滴没想到曹阿门这个大眼的碧池会问道这个问题,让我说说java Object类中的Hashcode和equals方法。
哇靠兄弟们我被坑了,必须给兄弟萌讲清楚。耀杨先从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前缀的就发蒙,其实完全没有必要,一定不要慌,来康康耀杨,心情愉悦还能学到知识诶嘿!
在这里耀杨崽再次引入两个概念:
1. 物理地址
2. hashcode代表对象的地址
Hashcode究竟是什么?
简单来说,Hascode是通过Hash算法得到的,在hash表中有其对应的位置。
-
每个对象都有着其物理地址,物理地址可以被转换为一个整数,该整数通过一定的hash算法可以得到hashcode,此时就得到了该对象在hash表中的位置。
-
在hash表中有hashcode的十个位置,分别是一到十。当一个对象S被存入内存,转化为一个对应整数,通过算法可以转化为一个确定的Hashcode值,所以对象S在Hash中的位置就是该Hashcode值与原Hash表中Hashcode值对应的位置。
物理地址
兄弟萌需要搞清楚一个概念:物理地址就是对象在内存中的位置。
hashcode代表对象的位置
hashcode代表对象的位置就是对象在hash表中的位置。
Hashcode用来干什么?
好多兄弟萌私信耀杨为什么不直接用物理地址呢?hashcode 的引入到底有什么用?
⭐️在计算机的世界中,数据量无疑是巨大的,如果都是通过简单的依次遍历来实现对象的查询,这样的方法无疑是低效的。
这时候聪明的人们就想出了一个好办法,将对象物理地址的值转换为整数,并且计算出hash值,存放到相同值的hash表中的hashcode位置。
⭐️也就是说当你在hash表中存放了1000个数据时,这些数据会根据hash算法的得到的hash值存放到相应的hashcode位置。
当然hashcode位置可能不止一个数据,但是这样的查找方式就不用一个个数据进行比对了,速率当然会加快了!!
⭐️ 这就相当于我们在学校中一个个找和分班找差不多,而每个同学分配到哪个班级都是系统特定算法计算的,这个时候我们想要****查找这个同学,只需重新计算他所在的班级,然后进入班级中比对。
在班级中比对的过程就涉及到了equals方法。
equals和hashcode方法的联系
1.equals 判断的是两个对象的引用指向的是不是同一个对象;
2.hashcode是根据对象地址生成一个整数数值;3.等价的两个对象的hashcode一定相等,而hashcode相等的两个对象不一定等价。
4.hashcode相等只能说明两个对象在散列存储结构中除以同一位置。
由于上面的方法,我们必须要提到的是:
我们在重写了equals方法后,尽量也重写了hashcode方法,通过一定的算法,使他们在equals相等时,也会有相同的hashcode值。
有关于equals与“==”的比较,如何进行equals以及hashcode方法的重写将于下篇为兄弟萌深入讲解。
《哇靠shy老师❗️❗️❗️》
兄弟萌今天也不想这么早结束的,可是我shy老师今天三场mvp,我耀杨必须奖励自己了嘿哈,
、
今天依旧是爱你萌的耀杨!!!