首先首推一个文章链接: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);
}
}