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

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

hashcode問題

什么時候要重寫hashcode什么時候不要呢?

正在回答

2 回答

跟哈希表有關的集合基本都要重寫,如果不重寫的話,調用的是Object的hashCode方法(返回的是堆中對象的地址,即棧中的引用變量存儲的值)。

舉個例子:

假設Student類中有2個成員變量:年齡,姓名。

然后main方法定義一個HashSet集合用來存儲Stundent對象(假定我們查詢的時候利用名字不同來判斷對象不同)

然后有這樣3個對象(3個學生) ? ?{“小明”,19歲}。{“小紅”, 20歲}。{“小明”,7歲}。

當把這3個對象依次放進HashSet集合時,HashSet集合將會先判斷hashCode值是否一樣,如果不重寫HashCode方法,則返回的是這3個對象的地址,那么???{“小明”,19歲},{“小明”,7歲}都被加了集合中。姓名就重復了,這違反了Hash表的宗旨。Hash表要求每個元素的hashCode都需要不一樣的,所以這個時候就需要重寫HashCode方法與equals方法,使得{“小明”,19歲}與{“小明”,7歲}的hashCode值一樣,equals方法返回true,這樣這2個小明就不會被添加進去了。

記住就行:基本上跟哈希表有關的集合基本都要重寫hashCode方法與equals()方法。比如HashSet,HashMap,LinkedHashSet......


3 回復 有任何疑惑可以回復我~
#1

紫_羽 提問者

非常感謝!
2016-08-15 回復 有任何疑惑可以回復我~
#2

慕粉4279355

太感謝!這個例子終于把我的困惑解決了!
2016-11-13 回復 有任何疑惑可以回復我~
#3

Sean_Chou

很給力,讓我也想明白了這個問題,感謝!
2017-11-19 回復 有任何疑惑可以回復我~

java?里有個超類,就是所有的類都繼承至那個類,叫Object。這個知道不?這個類有equals和hashCode方法,所以你要做一些你自定義的比較,你就要重寫這些方法。

比如你知道Set這個集合是不能存相同內容的嗎?它判斷相同內容的依據就是存進去的這個對象與set這個集合里面存在的各個對象的hashcode比較是否相同。如果相同,就存不進去。

0 回復 有任何疑惑可以回復我~
#1

紫_羽 提問者

除了set集合外還有那些集合要重寫hashcode方法呢?可以列舉出來嗎?
2016-08-13 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
Java入門第三季
  • 參與學習       409775    人
  • 解答問題       4546    個

Java中你必須懂得常用技能,不容錯過的精彩,快來加入吧

進入課程

hashcode問題

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

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

公眾號

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