云开·全站体育app登录 hashcode是什么?

发布于:25-07-20 播放次数:

一、hashcode是什么?

1、hash和hash表是什么?

若想了解该hashcode,首先必须掌握hash的概念,不妨查阅一下百度百科的相关内容。

hashcode_hashcode与hash表关系_hashcode是什么

hash函数是一种算法,其核心实现机制即通过一系列计算步骤,最终生成一个特定的hash值。此刻,我们必须了解一个概念,即哈希表。借助哈希算法计算出的哈希值存储于哈希表中,换言之,哈希表是由所有哈希值构成的集合。存在众多不同的哈希函数,这也就意味着有多种算法可以计算出哈希值,例如截图中所展示的三种。稍后,我们将以第一种算法为例进行讲解。

2、hashcode

基于前面的知识储备,接下来的讲解便会相对容易理解。所谓的hashcode,实际上是通过hash函数计算得出的,简单来说,它就是通过某种算法计算出来的,并在hash表中占据相应的位置。

每个对象都具备一个哈希码,那么这个哈希码究竟是如何生成的呢?

一个对象必然具备物理地址,在其他文章中,hashcode常被称作对象的地址,这可能会让读者产生误解。实际上,对象的物理地址与hashcode地址并不相同。hashcode所指的是对象在hash表中的位置,而物理地址则是指对象在内存中的存储地址。那么,对象是如何获得hashcode的呢?

对象的内部地址,亦即物理地址,被转换成整数形式,随后这个整数通过hash函数的计算过程,生成了hashcode。那么,hashcode究竟是什么?它就是hash表中相应位置的标识。

若对此尚不甚明了,不妨以实例说明。假设在hash表中存在八个位置,其hashcode分别为1、2、以及后续的3、4、5、6、7、8。若对象A的物理地址被转换为一个整数17(仅为假设),那么运用直接取余算法,即17除以8的余数为1,则A的hashcode即为1kaiyun.ccm,并且A将位于hash表的第1个位置。

必然存在其他疑问,请继续向下阅读,此处仅以实例展示,以便大家理解hashcode的内涵。

二、hashcode有什么作用呢?

关于hash函数的种种以及hashcode的生成方式,以及它所对应的hash表中的具体位置,或许大家会产生这样的疑问:为何不直接将hashcode等同于物理地址,而要额外使用一张hash表来标识对象的存储位置?下面,我将向大家阐述hashcode的真正作用。

存在HashCode的目的是为了提升搜索效率,它被用于在散列存储结构中确定对象的存储位置,即通过HashCode来标识对象在哈希表中的具体方位。

为何哈希码能够实现快速查找?以一个可容纳1000个数字的大内存为例,若要在其中存放1000个互不相同的数字,最原始的方法是存入一个数字后,对整个内存进行一次遍历,以检查是否已存在相同的数字。当存储了900个数字后,若要存入第901个数字,则需要与之前的900个数字逐一比对,这过程相当繁琐,耗时也较多。而通过哈希码来记录对象的位置,则能简化这一过程。

在hash表中,1至8号位置分别存储着数字,当第一个数的hashcode为1时,它会被放置在1号位置。当存储100个数字后,8号位置上会累积大量数据,比如1号位置可能存储了20个数字。若要存储第101个数字,系统会先查找其hashcode对应的位置,假设是1号位置,那么就会遇到20个与该hashcode相同的数字。此时,只需将这些数字逐一进行equals比较,若均相同,则将新数字存入1号位置,这样大大减少了比较的次数。尽管这里仅以8个位置为例,但hash表中位置众多,实际比较次数看似不少,实则若hash表规模庞大,比较次数将显著减少。

对比了原始方法与hashcode方法,我们得以领悟hashcode的效用,同时明了了采用hashcode的必要性。

三、equals方法和hashcode的关系?

通过上述示例,我们可以大致了解到,首先利用hashcode进行对象间的比较,若hashcode值相同,则进一步使用equals方法来判断两个对象是否真正相等。

举例来说,我们提到的哈希表中的八个槽位,可以类比为八个容器,每个容器能够容纳众多实体。例如,实体A借助哈希函数算法被定位至1号容器,与此同时,其他实体也有可能被分配到同一个容器。若实体B同样通过算法被放入1号容器,那么它将如何辨别容器内是否存在与自身相同的实体呢?此时kaiyun全站网页版登录,就需要借助equals方法来进行甄别。

若两个对象的equals方法返回结果一致,则这两个对象的hashCode值必然彼此相同。

若两个对象的哈希码相等,这并不意味着这两个对象本质上是相同的,它仅仅表明这两个对象在散列存储的体系中,被安排在了同一个存储位置。

这两条你们就能够理解了。

在进行equals方法的重写时,为何还推荐同时修改hashcode方法呢?

一旦对象的equals方法被修改,就应尽可能地对HashCode方法进行相应的修改。

举个例子,其实就明白了这个道理,

例如,某个类对equals方法进行了重写,却未对hashCode方法进行修改。观察输出结果开yun体育app官网网页登录入口,我们发现对象a1与对象a2在调用equals方法时被认为是相等的。依照先前所述的hashCode方法的使用规则,这两个对象的hashCode值应当相同。然而,由于未对hashCode方法进行重写,它们的hashCode值实际上并不相同。因此,在重写equals方法之后,我们应尽量重写hashCode方法,并采用特定的算法,以确保当两个对象在equals方法中相等时,它们的hashCode值也保持一致。

hashcode是什么_hashcode与hash表关系_hashcode

现在,让我们来分析String类源码中的equals函数与hashCode函数。该类对这两个函数进行了重写,那么,大家是否已经明白为何需要对其进行重写了呢?

equals方法与之前所提示例所遵循的原理相同,故通过查阅源码,我们了解到String类的equals方法是用来检验两个字符串内容是否相同的。此外,Double类同样对这些方法进行了重写。众多类在具备比较功能时,均对这两个方法进行了重写,这是因为它们均继承自所有类的父类Object。实际上,equals方法的功能等同于“==”操作符。你们可以对比String对象中的equals方法和==操作符之间的差异。这一点此处不再赘述。

hashcode与hash表关系_hashcode_hashcode是什么

hashcode方法

hashcode与hash表关系_hashcode_hashcode是什么