为了账号安全,请及时绑定邮箱和手机立即绑定

为何要重写Course下的hashCode()和equals()方法?重写方法的代码是自动生成的且只字未改。

重写的hashCode()和equals()方法,区别只是方法所在的位置不同,方法原来的代码在父类Object类,而重写后方法在子类Course中,既然代码没有作任何改动为何运行结果会不一样呢?

看了很多类似问题,但没能看得懂呢,能否通俗易懂的讲解下?

正在回答

4 回答

感觉和这个问题的原因类似,可以参考理解一下

在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,如侵权则删除)

2 回复 有任何疑惑可以回复我~
#1

慕勒9549435 提问者

非常感谢!
2018-02-27 回复 有任何疑惑可以回复我~

有一点是可以肯定的,虽然没有改动,但肯定和Object类中的方法体是不一样的。至于为什么会自动重写成那样,我也不清楚。

1 回复 有任何疑惑可以回复我~

 兄弟去看看这个,这个要看个人理解,,,http://huaxia524151.iteye.com/blog/729074

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

为何要重写Course下的hashCode()和equals()方法?重写方法的代码是自动生成的且只字未改。

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信