重写equals 为什么一定要重写hashcode?
我们新建一个类时,都是默认继承Object类,Object类的equals方法是比较是否指向同一个对象(对象内存地址是否相同)
equals与hashCode是Object类是两个方法,非常重要
查看Object源码
public native int hashCode();
public boolean equals(Object obj) {
return (this == obj);
}
一个类只重写了equals方法,那么对象equals为true,不重写hashCode,会默认使用object的hashcode方法,object的hashcode是本地方法,java的内存是安全的,因此无法根据散列码得到对象的内存地址
注: hashcode是根据内存地址计算出来的,
因此equals比较为true,hashcode比较为false
那么对于hash散列表结构的容器集合,就会出现问题
实际用代码验证:
import java.util.Objects;
public class User {
private int id;
private String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return id == user.id &&
Objects.equals(name, user.name);
}
public static void main(String[] args) {
User u1=new User(1,"kevin");
User u2=new User(1,"kevin");
System.out.println("equals比较结果:"+(u1.equals(u2)));
System.out.println("hashcode比较结果: "+(u1.hashCode()==u2.hashCode()));
}
}
运行结果:
equals比较结果 :true
hashcode比较 :false
u1.equals(u2)为true,根据hashcode 规则,两个对象相等,hashcode一定相等,这里就矛盾了.
关于hashcode与equals总结:
两个对象相等,hashcode一定要相同.
两个对象不相等,hashcode不一定不相等
hashcode相等,两个对象不一定相等
hashcode不相等,两个对象一定不等.

浙公网安备 33010602011771号