为什么重写equals()就一定要重写hashCode()方法

Object类,所有类的父类

一、为什么重写equals()方法一定要重写hashCode()方法

1.首先解释equals方法和hashcode方法分别是用来干什么的?

equals()方法:

在Object类源码(如下所示)中,其底层是使用了“==”来实现,也就是说通过比较两个对象的内存地址是否相同判断是否是同一个对象。

public boolean equals(Object obj) { return (this == obj); }

但是在实际应用中,该方法不能满足的我们的需求。因为我们认为两个对象即使不是指向的同一块内存,只要这两个对象的各个字段属性值都相同,那么就认为这两个对象是同一个对象。所以就需要重写equals()方法,即如果两个对象指向内存地址相同或者两个对象各个字段值相同,那么就是同一个对象。

hashCode()方法:

一提到hashcode,很自然就想到哈希表。将某一key值映射到表中的一个位置,从而达到以O(1)的时间复杂度来查询该key值。Object类源码(如下所示)中,hashCode()是一个native方法,哈希值的计算利用的是内存地址。

public native int hashCode();

可以认为利用哈希表也能起到一定的判重的作用,但是现实是可能存在哈希冲突,即使是两个不同的对象,他们的哈希值也可能相同,如何解决哈希冲突,这里就略略略了。总之,我们记住哈希表具有优越的查询性能,并且存在哈希冲突。

hash冲突:

public static void main(String[] args) { String astring = "Ok"; String bString = new String("Ok"); System.out.println(astring.hashCode()); System.out.println(bString.hashCode()); }

输出:

2556

2556

2.equals()方法和hashCode()方法两者有什么关系?

  1. 如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相 同!!!!;

  2. 如果两个对象不同(即用equals比较返回false),那么它们的hashCode值可能相同也可能不同;

\3. 如果两个对象的hashCode相同(存在哈希冲突),那么它们可能相同也可能不同(即equals比 较可能是false也可能是true)

4.如果两个对象的hashCode不同,那么他们肯定不同(即用equals比较返回false)

3.最后来看为什么重写equals()就一定要重写hashCode()方法?

对于对象集合的判重,如果一个集合含有100个对象实例,仅仅使用equals()方法的话,那么对于一个对象判重就需要比较4950次,随着集合规模的增大,时间开销是很大的。但是同时使用哈希表的话,就能快速定位到对象的大概存储位置,并且在定位到大概存储位置后,后续比较过程中,如果两个对象的hashCode不相同,也不再需要调用equals()方法,从而大大减少了equals()比较次数。所以从程序实现原理上来讲的话,既需要equals()方法,也需要hashCode()方法。那么既然重写了equals(),那么也要重写hashCode()方法,以保证两者之间的配合关系。

二、java访问权限修饰符明细表

修饰符 当前类 同 包 子 类 其他包

public √ √ √ √

protected √ √ √ ×

默认 √ √ × ×

private √ × × ×

-------------------------------------------------------------------------------------------------

protected 和 默认 的区别还在于 默认 修饰的的方法只能限制的本包当中,其他包当中的子类不能调用

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值