一、equals()和hashCode()是Object类自带的方法, equals()方法内部是用“==”(双等号)比较两个数值是否相等。hashCode()在Object类中调用的本地c++语言的方法。代码如下:
@IntrinsicCandidate
public native int hashCode();
public boolean equals(Object obj) {return (this == obj);}
equals()方法中双等号的本质是比较两个数据的所在的地址是否相同,如果是数据是非引用类型,如:int、char、long等基础类型,则比较的是两个数据对应的值是否相同。
二、任何类都继承了Object类,所有每个类里面都有equals()和hashCode()方法,如果不重写该方法,那么实例化后的引用对象调用的equals()方法会直接调用父类的方法,使用双等号直接比较引用对象的地址值,而我们期望的往往是其两个对象的内容相等便认定其相等即可,所以需要我们重写equals()和hashCode()方法。
三、hashCode()方法给对象返回一个hash code值。这个方法被用于hash tables,例如HashMap。(全部方法注释可见于 java.lang.Object类)
四、当equals()方法被override时,hashCode()也要被override。按照一般hashCode()方法的实现来说,相等的对象,它们的hash code一定相等。
示例:
没有重写equals()方法:
public class Demo {
private Integer id;
private String name;
public Demo() {}
public Demo(Integer id, String name) {
this.id = id;
this.name = name;
}
}
public static void main(String[] args) {
Demo demo1 = new Demo(1,"demo");
Demo demo2 = new Demo(1,"demo");
boolean equals = demo2.equals(demo1);
System.out.println("demo2.equals(demo1) : " + equals);
}
运行结果:
demo2.equals(demo1) : false
重写equals()方法后:
public class Demo {
private Integer id;
private String name;
public Demo() {}
public Demo(Integer id, String name) {
this.id = id;
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Demo demo = (Demo) o;
return id.equals(demo.id) && name.equals(demo.name);
}
@Override
public int hashCode() {return Objects.hash(id, name);}
}
运行结果:
demo2.equals(demo1) : true