我们新建一个类时,都是默认继承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不相等,两个对象一定不等.