亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

為何要重寫Course下的hashCode()和equals()方法?重寫方法的代碼是自動生成的且只字未改。

重寫的hashCode()和equals()方法,區別只是方法所在的位置不同,方法原來的代碼在父類Object類,而重寫后方法在子類Course中,既然代碼沒有作任何改動為何運行結果會不一樣呢?

看了很多類似問題,但沒能看得懂呢,能否通俗易懂的講解下?

正在回答

3 回答

感覺和這個問題的原因類似,可以參考理解一下

在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下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號