Java回顾---equals与hashcode

equals方法

没有重新equals方法时默认调用的是Object中的equals方法:

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

可以看到,它直接通过“==”来比较两个对象,也就是判断两个对象是否是同一个对象。

hashCode方法

  1. 程序运行期间,同一个对象多次调用hashCode方法的返回的int值必须相同。
  2. equals方法结果为true的两个对象必须具有相等的哈希码。
  3. 如果两个对象的hashCode相同,它们的equals方法并不一定返回true。

equals方法和hashCode方法的关系

其实就是上面的后两条:

  • 两个不相同对象的hashCode方法可能返回相同的int值,但是hashCode返回值相同的两个对象不一定通过equals方法比较返回true。
    从数学的角度来说:equals比较两个对象相等是hashCode相等的充分不必要条件

  • equals方法比较结果相等的两个对象,它们的hashCode方法返回值一定相同

  • 为什么重写equals一定要重写hashcode?

    原因

    • 假如只重写equals而不重写hashcode,那么此时调用的就是Object默认的hashcode方法,由于默认的hashcode方法是根据对象的内存地址经哈希算法得来的,显然此时obj1 != obj2,故两者的hashcode不一定相等。
    • 然而重写了equals,且obj1.equals(obj2)返回true,根据上面hashcode的第二条性质,两个对象相等其哈希值一定相等,所以矛盾就产生了,因此重写equals一定要重写hashcode.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值