重写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不相等,两个对象一定不等.

posted @ 2020-06-11 18:53  时间都哪去了  阅读(124)  评论(0)    收藏  举报