課程
/后端開(kāi)發(fā)
/Java
/Java入門(mén)第三季
什么時(shí)候要重寫(xiě)hashcode什么時(shí)候不要呢?
2016-08-13
源自:Java入門(mén)第三季 6-4
正在回答
跟哈希表有關(guān)的集合基本都要重寫(xiě),如果不重寫(xiě)的話,調(diào)用的是Object的hashCode方法(返回的是堆中對(duì)象的地址,即棧中的引用變量存儲(chǔ)的值)。
舉個(gè)例子:
假設(shè)Student類(lèi)中有2個(gè)成員變量:年齡,姓名。
然后main方法定義一個(gè)HashSet集合用來(lái)存儲(chǔ)Stundent對(duì)象(假定我們查詢的時(shí)候利用名字不同來(lái)判斷對(duì)象不同)
然后有這樣3個(gè)對(duì)象(3個(gè)學(xué)生) ? ?{“小明”,19歲}。{“小紅”, 20歲}。{“小明”,7歲}。
當(dāng)把這3個(gè)對(duì)象依次放進(jìn)HashSet集合時(shí),HashSet集合將會(huì)先判斷hashCode值是否一樣,如果不重寫(xiě)HashCode方法,則返回的是這3個(gè)對(duì)象的地址,那么???{“小明”,19歲},{“小明”,7歲}都被加了集合中。姓名就重復(fù)了,這違反了Hash表的宗旨。Hash表要求每個(gè)元素的hashCode都需要不一樣的,所以這個(gè)時(shí)候就需要重寫(xiě)HashCode方法與equals方法,使得{“小明”,19歲}與{“小明”,7歲}的hashCode值一樣,equals方法返回true,這樣這2個(gè)小明就不會(huì)被添加進(jìn)去了。
記住就行:基本上跟哈希表有關(guān)的集合基本都要重寫(xiě)hashCode方法與equals()方法。比如HashSet,HashMap,LinkedHashSet......
紫_羽 提問(wèn)者
慕粉4279355
Sean_Chou
java?里有個(gè)超類(lèi),就是所有的類(lèi)都繼承至那個(gè)類(lèi),叫Object。這個(gè)知道不?這個(gè)類(lèi)有equals和hashCode方法,所以你要做一些你自定義的比較,你就要重寫(xiě)這些方法。
比如你知道Set這個(gè)集合是不能存相同內(nèi)容的嗎?它判斷相同內(nèi)容的依據(jù)就是存進(jìn)去的這個(gè)對(duì)象與set這個(gè)集合里面存在的各個(gè)對(duì)象的hashcode比較是否相同。如果相同,就存不進(jìn)去。
舉報(bào)
Java中你必須懂得常用技能,不容錯(cuò)過(guò)的精彩,快來(lái)加入吧
3 回答關(guān)于hashcode()的問(wèn)題
1 回答equals和hashCode重寫(xiě)問(wèn)題
1 回答hashcode()方法
1 回答hashcode方法重寫(xiě)的疑問(wèn)
2 回答關(guān)于輸出結(jié)果是hashcode
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號(hào)-11 京公網(wǎng)安備11010802030151號(hào)
購(gòu)課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動(dòng)學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號(hào)
2016-08-14
跟哈希表有關(guān)的集合基本都要重寫(xiě),如果不重寫(xiě)的話,調(diào)用的是Object的hashCode方法(返回的是堆中對(duì)象的地址,即棧中的引用變量存儲(chǔ)的值)。
舉個(gè)例子:
假設(shè)Student類(lèi)中有2個(gè)成員變量:年齡,姓名。
然后main方法定義一個(gè)HashSet集合用來(lái)存儲(chǔ)Stundent對(duì)象(假定我們查詢的時(shí)候利用名字不同來(lái)判斷對(duì)象不同)
然后有這樣3個(gè)對(duì)象(3個(gè)學(xué)生) ? ?{“小明”,19歲}。{“小紅”, 20歲}。{“小明”,7歲}。
當(dāng)把這3個(gè)對(duì)象依次放進(jìn)HashSet集合時(shí),HashSet集合將會(huì)先判斷hashCode值是否一樣,如果不重寫(xiě)HashCode方法,則返回的是這3個(gè)對(duì)象的地址,那么???{“小明”,19歲},{“小明”,7歲}都被加了集合中。姓名就重復(fù)了,這違反了Hash表的宗旨。Hash表要求每個(gè)元素的hashCode都需要不一樣的,所以這個(gè)時(shí)候就需要重寫(xiě)HashCode方法與equals方法,使得{“小明”,19歲}與{“小明”,7歲}的hashCode值一樣,equals方法返回true,這樣這2個(gè)小明就不會(huì)被添加進(jìn)去了。
記住就行:基本上跟哈希表有關(guān)的集合基本都要重寫(xiě)hashCode方法與equals()方法。比如HashSet,HashMap,LinkedHashSet......
2016-08-13
java?里有個(gè)超類(lèi),就是所有的類(lèi)都繼承至那個(gè)類(lèi),叫Object。這個(gè)知道不?這個(gè)類(lèi)有equals和hashCode方法,所以你要做一些你自定義的比較,你就要重寫(xiě)這些方法。
比如你知道Set這個(gè)集合是不能存相同內(nèi)容的嗎?它判斷相同內(nèi)容的依據(jù)就是存進(jìn)去的這個(gè)對(duì)象與set這個(gè)集合里面存在的各個(gè)對(duì)象的hashcode比較是否相同。如果相同,就存不進(jìn)去。