hashCode()和equals()的关系,为什么重写了equals,必须重写hashCode方法?

hashCode()和equals(),都属于Object类里面的方法,因此所有的Java类都含有这二方法。

三条:

一、equeals相等,那么hashCode一定相等

二、hashCode相等,那么equals不一定返回true

三、hashCode不相等,那么equals一定不相等

因此,equals比hashCode更加复杂,它判断的相等与否更加绝对,更加有效。

hashCode()该方法的作用就是获取哈希码,哈希码是一个int型数字,用来确定对象在哈希表中的索引位置。

为什么有了equals这样有效的方法还需要hashCode呢?

因为:

在HashSet(特性:不含有重复的内容),有新对象加入时,会先计算对象的HashCode值来判断对象加入的位置,同时于已有的对象hashCode作比较,如果有相同的,再用equals去比较,若相同那么则不加入hashSet,若不相同,会使其加入到其他的位置。如果没有其他对象hashCode与之相同的,那么这个对象必定是一个新对象,这样就减少了equals的执行次数、先用hashCode去比较,从而大大提高了速度

如果重写了equals,必须重写hashCode方法

如果没有重写hashCode方法,那么该类的两个对象的hashCode无论如何都不会相等

哈希码是一种算法,让同一个类的不同对象按照自己不同的特征尽量有不同的哈希码,但是,不同对象的哈希码也不一定完全不同,这个取决于哈希码的算法怎么写

例如:

Object类的哈希算法:返回对象内存地址经过处理后的结构,由于每个对象的内存地址不一样,所以哈希码不一样。

String类的哈希算法:根据String类包含的字符串内容,根据一种特殊算法返回哈希码,只要字符串所在的堆空间相同,返回的哈希码也相同。

Integer类的哈希算法:返回的哈希吗就是integer对象里面所包含的那个整数的值,因此,2个大小一样的Integer对象,返回的哈希码也一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值