為何要重寫Course下的hashCode()和equals()方法?重寫方法的代碼是自動(dòng)生成的且只字未改。
重寫的hashCode()和equals()方法,區(qū)別只是方法所在的位置不同,方法原來(lái)的代碼在父類Object類,而重寫后方法在子類Course中,既然代碼沒有作任何改動(dòng)為何運(yùn)行結(jié)果會(huì)不一樣呢?
看了很多類似問題,但沒能看得懂呢,能否通俗易懂的講解下?
重寫的hashCode()和equals()方法,區(qū)別只是方法所在的位置不同,方法原來(lái)的代碼在父類Object類,而重寫后方法在子類Course中,既然代碼沒有作任何改動(dòng)為何運(yùn)行結(jié)果會(huì)不一樣呢?
看了很多類似問題,但沒能看得懂呢,能否通俗易懂的講解下?
2017-10-05
舉報(bào)
2018-02-27
感覺和這個(gè)問題的原因類似,可以參考理解一下
在hibernate中,它認(rèn)為2個(gè)對(duì)象只要equals返回true,那么hashCode一定相等。 但是實(shí)際情況呢?
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會(huì)產(chǎn)生錯(cuò)誤判斷,又以為它們不是同一個(gè)對(duì)象,因此我們還得重寫User 的hashCode方法。如何重寫hashCode方法呢?
哈希碼要完成這么一件事,首先要保證如果equlas出來(lái)的結(jié)果相等,那么hashCode也相等。像上面的u1和u2,由于名字都是“張三”,所以應(yīng)該返回相同的hashCode。所以我們可以想一個(gè)辦法。讓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;
//如果名字相同,則表示屬于同一個(gè)對(duì)象。
if (user.getName().equals(this.getName)){
return true;
}else{
return false;
}
}
//覆蓋Object里的hashCode方法
public int hashCode() {
return name.hashCode();//返回名字的哈希碼。
}
}
這樣可以保證hibernate根據(jù)我們自己的需求來(lái)判斷重復(fù)對(duì)象
(以上引自百度百科https://baike.baidu.com/item/%E5%93%88%E5%B8%8C%E7%A0%81/5035512?fr=aladdin,如侵權(quán)則刪除)
2017-11-19
有一點(diǎn)是可以肯定的,雖然沒有改動(dòng),但肯定和Object類中的方法體是不一樣的。至于為什么會(huì)自動(dòng)重寫成那樣,我也不清楚。
2017-10-06
?兄弟去看看這個(gè),這個(gè)要看個(gè)人理解,,,http://huaxia524151.iteye.com/blog/729074