为什么重写equals,就必须重写hashCode

当重写equals改变对象相等逻辑时,也需重写hashCode,以确保一致性。否则,在使用如HashSet等依赖hashCode的集合时,可能会导致预期外的存储结果,因默认的hashCode是基于内存地址的。
摘要由CSDN通过智能技术生成

为什么重写equals,就必须重写hashCode

首先得看一下 equals 与 hashCode 在Object中的源码:

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

   /**
   *在合理可行的情况下,由类Object定义的hashCode方法确实为不同的对象返回不同的整数。
   *(这通常是通过将对象的内部地址转换为整数来实现的,但是java不需要这种实现技术;编程语言)。
   */
public native int hashCode();

hashCode 是一个native 方法,native 关键字表示该方法的实现是用其他语言编写的,通常是 C 或 C++。在这种情况下,hashCode() 方法的实际实现是由 JVM(Java 虚拟机)本身提供的。方法注释中说 hashCode的结果是根据对象的内存地址计算得出的,也就是说只要对象的内存地址不变,那多次hash出来的值都是一样的。而此时的equals比对规则是通过 == 来进行比对的,==比对实际就是比对两个对象的内存地址,所以 Object 中用equalshashCode 来比对两个对象是否相同,都是一致的,都是比对的内存地址.

现在就可以解释为什么对象重写equals,就必须重写hashCode了。

结论: 因为如果你重写了equals,改变了equals的比对逻辑,也就是说你重新定义了这个对象的相等逻辑,而不重写hashCode的话,hashCode还是沿用Object中的内存比对,在好多情况下会得到你预料不到的结果。

产生隐异常举例:

看此例子前可以先了解一下hashSet集合的存储原理。

hashSet中对一个元素进行存储是通过调用这个元素对象的 hashCode 方法得到值再对这个值进行hash得到存储下标的,这里就出现了一个隐性异常,就是你都重写了这个对象的比对规则,而存储时判断相等还是用的内存地址比对,这就会得到你不想得到的存储结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值