重写equals方法时必须重写hashcode
有规范:
1,当obj1.equals(obj2) 为 true 时,obj1.hashCode() == obj2.hashCode()
2,当obj1.equals(obj2) 为 false 时,obj1.hashCode() != obj2.hashCode()
原因:
如果只重写了equals方法,
出现了问题,两个对象equals方法比较为true,但是hashcode值不相等,违背了规范。
hashmap中存储数据时,先调用hashCode,唯一则存储,不唯一则再调用equals,结果相同则不再存储,结果不同则散列到其他位置。
如果我们将对象的equals方法重写而不重写hashcode,当我们再次new一个新的对象的时候,equals方法返回的是true,但是hashCode方法返回的就不一样了,如果需要将这些对象存储到结合中(比如:Set,Map …)的时候就违背了原有集合的原则
总结:
1、两个对象,用==比较比较的是地址,需采用equals方法(可根据需求重写)比较
Object类源码:
public boolean equals(Object obj) {
return (this == obj);
}
2,重写equals()方法就重写hashCode()方法。
3,一般相等的对象都规定有相同的hashCode。
4,String类重写了equals和hashCode方法,比较的是值。
5,重写hashcode方法为了将数据存入HashSet/HashMap/Hashtable(可以参考源码有助于理解)类时进行比较