为何要重写Course下的hashCode()和equals()方法?重写方法的代码是自动生成的且只字未改。
重写的hashCode()和equals()方法,区别只是方法所在的位置不同,方法原来的代码在父类Object类,而重写后方法在子类Course中,既然代码没有作任何改动为何运行结果会不一样呢?
看了很多类似问题,但没能看得懂呢,能否通俗易懂的讲解下?
重写的hashCode()和equals()方法,区别只是方法所在的位置不同,方法原来的代码在父类Object类,而重写后方法在子类Course中,既然代码没有作任何改动为何运行结果会不一样呢?
看了很多类似问题,但没能看得懂呢,能否通俗易懂的讲解下?
2017-10-05
感觉和这个问题的原因类似,可以参考理解一下
在hibernate中,它认为2个对象只要equals返回true,那么hashCode一定相等。 但是实际情况呢?
User u1 = new User(“张三”);
User u2 = new User(“张三”);
由于我们重写了User的equals方法,所以 u1.equals(u2);返回true 但是,User并没有重写hashCode方法,它用的是Object类的hashCode方法,所以 u1.hashCode = 31050006 u2.hashCode = 31587890 两者的hashCode并不相等。违背了hibernate的原则 由此hibernate会产生错误判断,又以为它们不是同一个对象,因此我们还得重写User 的hashCode方法。如何重写hashCode方法呢?
哈希码要完成这么一件事,首先要保证如果equlas出来的结果相等,那么hashCode也相等。像上面的u1和u2,由于名字都是“张三”,所以应该返回相同的hashCode。所以我们可以想一个办法。让User的[2] 哈希码返回User里面name字段的哈希码,这样就保证,名字相同的人,不但equlas方法相同,而且hashCode相等。 那么User类就变成
public class User{
private String userName;
//覆盖Object里的equals方法
public boolean equals(Object arg0){
if(!(arg0 instanceof User)){
return false;
}
User user = (User)arg0;
//如果名字相同,则表示属于同一个对象。
if (user.getName().equals(this.getName)){
return true;
}else{
return false;
}
}
//覆盖Object里的hashCode方法
public int hashCode() {
return name.hashCode();//返回名字的哈希码。
}
}
这样可以保证hibernate根据我们自己的需求来判断重复对象
(以上引自百度百科https://baike.baidu.com/item/%E5%93%88%E5%B8%8C%E7%A0%81/5035512?fr=aladdin,如侵权则删除)
举报