3 回答

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊
您需要提供自己的equals()
in 實(shí)現(xiàn)MyClass
。
@Overridepublic boolean equals(Object other) { if (!(other instanceof MyClass)) { return false; } MyClass that = (MyClass) other; // Custom equality check here. return this.field1.equals(that.field1) && this.field2.equals(that.field2);}
hashCode()
如果哈希表中有可能使用您的對(duì)象,則還應(yīng)該覆蓋。一個(gè)合理的實(shí)施將是該對(duì)象的字段的哈希碼喜歡的東西結(jié)合起來(lái):
@Overridepublic int hashCode() { int hashCode = 1; hashCode = hashCode * 37 + this.field1.hashCode(); hashCode = hashCode * 37 + this.field2.hashCode(); return hashCode;}
有關(guān)實(shí)現(xiàn)哈希函數(shù)的更多詳細(xì)信息,請(qǐng)參見(jiàn)此問(wèn)題。

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊
您需要覆蓋equals
和hashCode
。equals
將根據(jù)您需要的屬性比較對(duì)象的相等性,并且hashCode
必須進(jìn)行強(qiáng)制性操作才能使對(duì)象在Collections
和中正確使用Maps

TA貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個(gè)贊
您必須從類(lèi)Object正確重寫(xiě)方法equals()
編輯:我認(rèn)為我的第一反應(yīng)是被誤解了,可能是因?yàn)槲也惶_。因此,我決定添加更多說(shuō)明。
為什么必須重寫(xiě)equals()?好吧,因?yàn)檫@是開(kāi)發(fā)人員的工作,可以決定兩個(gè)對(duì)象相等意味著什么。在大多數(shù)情況下,引用相等是不夠的。
例如,假設(shè)您有一個(gè)HashMap,其鍵的類(lèi)型為Person。每個(gè)人都有名字和地址?,F(xiàn)在,您想使用鍵查找詳細(xì)的bean。問(wèn)題在于,您通常無(wú)法使用與地圖中的引用相同的引用創(chuàng)建一個(gè)實(shí)例。您要做的是創(chuàng)建Person類(lèi)的另一個(gè)實(shí)例。顯然,運(yùn)算符==在這里不起作用,您必須使用equals()。
但是現(xiàn)在,我們遇到了另一個(gè)問(wèn)題。假設(shè)您的集合很大,并且您想執(zhí)行搜索。天真的實(shí)現(xiàn)將使用equals()將您的鍵對(duì)象與映射中的每個(gè)實(shí)例進(jìn)行比較。但是,那將是非常廣闊的。這里是hashCode()。正如其他人指出的那樣,哈希碼是一個(gè)唯一的數(shù)字,不必唯一。重要的要求是,每當(dāng)equals()對(duì)兩個(gè)對(duì)象都為true時(shí),hashCode()必須為兩個(gè)對(duì)象返回相同的值。逆蘊(yùn)涵不成立,這是一件好事,因?yàn)楣4a將我們的密鑰分為各種存儲(chǔ)桶。在單個(gè)存儲(chǔ)桶中,我們有少量類(lèi)Person的實(shí)例。當(dāng)我們執(zhí)行搜索時(shí),該算法可以立即跳轉(zhuǎn)到正確的存儲(chǔ)桶,并且僅對(duì)每個(gè)實(shí)例執(zhí)行等于。
還有一點(diǎn)。有些集合要求在用作鍵的類(lèi)中正確實(shí)現(xiàn)hashCode()方法,不僅是出于性能方面的考慮。示例包括:HashSet和LinkedHashSet。如果它們不重寫(xiě)hashCode(),則默認(rèn)的Object hashCode()方法將允許將您可能認(rèn)為“有意義相等”的多個(gè)對(duì)象添加到“不允許重復(fù)”的集合中。
一些使用hashCode()的集合
HashSet的
LinkedHashSet
HashMap中
看看apache commons中的這兩個(gè)類(lèi),它們將使您輕松實(shí)現(xiàn)equals()和hashCode()
添加回答
舉報(bào)