hashCode和equals的关系,为什么要有hashCode

一、什么是hashCode

        1、hash和hash表

                首先,在了解hashCode之前,我们要知道什么是hash。

        

                 通过百度,我们可以了解到hash是一个函数,这个函数具体实现则是有一系列的算法。通过这一系列的算法,将任意的输入转变为固定长度的输出,这个输出就是 hash值。谈到hash值,就又要说到一个东西,那就是hash表,hash表是通过键值对(key-value)的方式来存放hash值的查找表。

        2、hashCode

                   有了前面对hash和hash表的了解,我们就不难知道,hashCode就是通过hash函数得到的一个记录对象在hash表中索引位置的值。

                     hashCode()方法定义在JDK的Obejct中,这也就意味着,java中所有的类包含有hashCode()函数。

二、为什么要有hashCode

        hashCode的存在是为了查找的快捷性,前面也说到了,hashcode是一个记录对象在hash表中索引位置的值。

        这里我们可以以“HashSet如何检索重复”为例子来说明:

        当我们把对象加入HashSet的时候,HashSet会先计算对象的hashCode值,来判断对象的加入位置,同时也会与HashSet中其他以及加入的对象的hashCode做比较,如果没有相同的hashCode,HashSet会假设对象没有重复出现。如果有相同hashCode的对象,这是就会调用equals对象,比较两个对象是否相等,如果两个对象相等,就不会进行加入操作,如果两个对象不同,就会重新散列到其他位置上去。这样的操作大大降低了我们equals的操作次数,提高了执行速度。

三、hashCode和equals相关规定

        通过上面的例子,我们也不难知道,是先通过比较hashCode,如果hashCode相同,再通过equals比较两个对象是否相等。所以也就有了以下的一些规定:

        1、如果两个对象相等、则hashCode一定相同。

        2、两个对象相等,则两个对象分别调用equals方法都返回true。

        3、两个对象hashCode相同,并不意味着他们两个相等。

        4、如果equals被重写,则hashCode也要被覆盖

         第4点是因为,hashCoded的默认行为是对堆上的对象产生一个特有的值,如果hashCode没有被重写,那么这个类的两个对象无论如何都不会相等,即使是指向相同的数据。        

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值