理解equals和hashcode

首先首推一个文章链接:Java重写equals方法(重点讲解) - 江河湖泊 - 博客园 (cnblogs.com)
然后这边我就简单总结一下:不管是equals还是hashcode他们如果不重写都是继承自父类:Object。

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

可以看到equals方法默认比较的是两个对象的引用(就是==),然后hashcode是一个native方法会返回一个32位的int型二进制值。
如果现在的需求时让一个自定义的类对象能在hashset中正常的存取,就必须同时重写equals和hashcode方法:

  • 当equals此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。如下:
    (1)当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true
    (2)当obj1.hashCode() == obj2.hashCode()为false时,obj1.equals(obj2)必须为false
public class MyClass {
    private int id;
    private String name;

    public MyClass(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof MyClass)) return false;
        MyClass myClass = (MyClass) o;
        return id == myClass.id &&
                Objects.equals(name, myClass.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容