重写了equals()就必须要重写hashCode()的原因:
首先java里面有集合,如hashmap,hashset等。相信都用过HashMap。根据key,可取value值。key不能重复,value可以重复是他的特点。说明key 是唯一的。
然后你为何要重写了equals()呢?是默认的equals()方法不符合你的要求,你自定义在某种情况下,对象Object的equals是true的。
那就会出现下面这种情况。
public class t {
public static void main(String[] args){
HashMap hashMap = new HashMap();
hashMap.put(new user5("mary"),"mary:50Kg");
hashMap.put(new user5("mary"),"mary:100000Kg");
System.out.println(hashMap.keySet());
System.out.println(new user5("mary").equals(new user5("mary")));//true
System.out.println(hashMap.get(new user5("mary"))); //null
}
}
class user5 {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "user{" +
"name='" + name + '\'' +
'}';
}
public user5(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
user5 user5 = (user5) o;
return Objects.equals(name, user5.name);
}
// @Override
// public int hashCode() {
// return Objects.hash(name);
// }
}
输出结果
[user{name='mary'}, user{name='mary'}]
true
null
这就有种违和感,你重写了equals()方法让他们‘相等’,但是在HashMap中key就‘重复’了。
造成这种状况的原因是,没new一个对象,他的hashcode值是不一样的。HashMap是根据hashcode来计算key的位置,即重复与否的。
把上述代码中的重写hashcode的返回发打开的结构。
[user{name='mary'}]
true
mary:100000Kg。