为什么hashCode()和equals()必须同时重写

在Object类中,有两种方法十分重要,分别是

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

很多时候,我们需要在自定义类的时候同时重写这两个方法,为什么需要同时重写呢?
首先来看一看
1、equals():返回两个对象地址是否相等的布尔值
2、hashCode():返回该对象的哈希值。哈希值是根据哈希表得到的,它代表着这个对象的储存地址。
可以发现,这两个方法都和对象的地址有关系,接下来解读一下hashCode翻译过来的注释

public int hashCode()返回对象的哈希码值。 支持这种方法是为了散列表,如HashMap提供的那样 。 
hashCode的总合同是: 

只要在执行Java应用程序时多次在同一个对象上调用该方法, hashCode方法必须始终返回相同的整数,前提是修改了对象中equals比较中的信息。 该整数不需要从一个应用程序的执行到相同应用程序的另一个执行保持一致。 
如果根据equals(Object)方法两个对象相等,则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。 
不要求如果两个对象根据equals(java.lang.Object)方法不相等,那么在两个对象中的每个对象上调用hashCode方法必须产生不同的整数结果。 但是,程序员应该意识到,为不等对象生成不同的整数结果可能会提高哈希表的性能。 
尽可能多的合理实用,由类别Object定义的hashCode方法确实为不同对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但Java的编程语言不需要此实现技术。) 

结果 
该对象的哈希码值。 

由上面的注释我们可以发现,hashCode()和equals()对比较信息是同时产生影响的。总的来说两者有以下规律:

  1. equals()为true,hashCode()必然相等:对象地址相同,hashCode一定相同
  2. equals()为false,hashCode()不一定不等:对象地址不同,hashCode通常不同,但是有时候因为内存原因导致其中一个对象的hashCode溢出,使得两者hashCode相同
  3. hashCode()相等, equals()不一定true:原理同上,可能因为内存原因导致其中一个对象的hashCode溢出,使得不同地址对象的hashCode相同
  4. hashCode()不等,equals()一定为false:hashCode不同,两者在内存中储存位置一定不同,,equals()一定为false。

所以,为了满足不同需求下的equals比较,我们在必要时需要重写equals()。为了不影响Object中hashCode()对equals()结果,我们必须也要同时重写hashCode()来保证我们达到想要的结果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值