簡體   English   中英

equals()沒有hashCode()

[英]equals() without hashCode()

如果我只需要比較對象而不打算將對象放入任何基於散列的容器中,我是否只能實現equals()而不是hashCode()?

似乎所有Java聖經都說這兩個必須一起實現。 :(

我擔心: - 如果我總是將equif()與hashCode()一起實現,那么將會有很多代碼沒有真正使用,並且沒有單元測試覆蓋。 (如果不使用的話,我不打算單元測試hashCode()) - 直到我將對象放入基於散列的容器中才知道如何查找對象。 直到那時我才能確定使用哪種散列策略。

你可以,但你將違反equals的一般合同,這將導致奇怪的錯誤。 即使你不認為你正在使用哈希碼,你傳遞對象的任何外部代碼也可能依賴於它們,即使它似乎不是基於哈希的。 如果你不打算給你的對象一個合適的哈希方法,至少讓它拋出一個運行時異常。 但是,為對象提供一個不錯的hashCode幾乎總是更好。

只要不是強制實現hashCode, 每當你實現equals時,你還必須實現hashCode

如果你沒有這樣做,你最終會得到破碎的物體。 為什么? 對象的hashCode方法必須將與其equals方法相同的字段考慮在內。 通過重寫equals方法,您將某些對象聲明為與其他對象相同,但原始的hashCode方法將所有對象視為不同的對象。 因此,您將擁有具有不同哈希碼的相等對象。 例如,即使已添加對象,在HashMap上調用contains()也將返回false。

我可以只實現equals()而不是hashCode()嗎?

是的你可以 。 因為它們只是來自父類Object ,所以它實際上是你選擇實現或不實現(一起或個人)。

All Java bibles say these two MUST be implemented together.

如果你沒有使用與hashcode相關的任何東西(正如你所說的基於散列的容器),它不是MUST ,但是將它們一起實現以避免任何意外情況是一個好習慣。

Oracle的教程回答了這個問題

hashCode()方法

根據定義,如果兩個對象相等,則它們的哈希碼也必須相等。 如果重寫equals()方法,則更改兩個對象的等效方式,並且Object的hashCode()實現不再有效。 因此,如果重寫equals()方法,則還必須覆蓋hashCode()方法。

是的,你可以,但是推薦嗎? 沒有

所有書籍都說,如果equals返回true,則哈希碼必須相同,這將是如此。 但是,最好為您自己的實例進一步指定它,就像您使用equals一樣。

是的,您只能在不實現hashcode()方法的情況下實現equals()方法。

但是標准實踐表明你應該實現它們,對於相同的對象,哈希碼應該是相同的。

嗯,顯然你可以,但你不打算使用散列的事實並不是不實現它的充分理由。 您使用的某些庫可以使用散列。 如果你想避免測試equals或hashcode,你可以嘗試自動生成這些方法(大多數IDE都有這個功能),或者使用項目lombok( https://projectlombok.org

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM