【为什么重写equals 还要重写hashcode?】

发布时间:2024年01月20日

为什么重写equals 还要重写hashcode?

equals 方法和 hashCode 方法是 Object 类中的两个基础方法,它们共同协作来判断两个对象是否相等。

为什么重写equals

默认情况下,Java中的 equals 方法比较的是对象的引用。如果我们不重写 equals 方法,那么对于两个不同的对象,即使它们的内容相同,调用 equals 方法也会返回 false,因为它们的引用不同。
例如:

public class Demo02 {
    public static void main(String[] args) {
        Cat cat1 = new Cat(18,"张三");
        Cat cat2 = new Cat(18,"张三");
        System.out.println(cat1.equals(cat2));
    }
}

在这里插入图片描述

这与我们平常使用的并不相符合,因此需要重写equals。

重写 equals

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Cat cat = (Cat) o;
        return age == cat.age &&
                Objects.equals(name, cat.name);
    }

为什么重写hashcode

不重写时,就算引用的对象相同,他们之间的hashcode的值也不相同,这样就会发生一件奇怪的事情。
众所周知,hashset中不可以存在相同的<key,value> 但是不重写hashcode会发生下面这件事:
在这里插入图片描述
为什么不一样呢?由于两个对象的物理地址(在内存中的位置)不同,会根据hash函数得出来的hashcode也不相同,故hashset并未将二者当成一个。但这种情况在我们现实中是不利的,所以需要重写。

重写:

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

为什么重写equals 还要重写hashcode?

根据上述两种情况我们可以得知,重写equals时也尽量把hashcode也重写了,避免不必要的麻烦。若当equals比较相同时,但hashcode比较不相同,则会出现明明二者equals相同,但在hashset中依然会出现重复。为了避免这种情况的发生,我们在重写完equals时也要把hashcode给重写了!!!

文章来源:https://blog.csdn.net/weixin_52485246/article/details/135708990
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。