簡體   English   中英

如果我重寫.equals(),即使我不使用HashMap,也需要重寫.hashCode()嗎?

[英]If I override .equals(), do I need to override .hashCode() even if I don't use a HashMap?

如果我選擇不將對象存儲在集合中,是否需要覆蓋哈希碼,或者我可以為對象使用相同的哈希碼? 性能好壞?

並非絕對必要,但是如果您以后決定存儲和排序對象,則最好這樣做。

絕對必要嗎? 沒有。

這是最佳做法嗎? 是。

如果您六個月內都沒有,它會再次咬你嗎? 也許。

相等的對象必須具有相等的哈希碼 ; 這是任何班級的合同。

如果您懶於實現體面的hashCode方法,則仍可以通過以下實現遵守合同:

  @Override public int hashCode() {
    return 0;
  }

在基於散列的集合中,它的性能會很差,但至少是正確的。

如果您始終重寫這些方法,則不會花費太多精力,更現代的IDE為您提供了此功能

不,您應該提供哈希碼。 你永遠不知道明天,你可能需要在那里使用它

如果A.equals(B) ,則A.hashCode() == B.hashCode()必須為true。

如果!A.equals(B) ,則A.hashCode() == B.hashCode()仍然可以為true。

如果不重寫hashCode()時,你重寫equals() ,然后將東西放入一些藏品實際上將失去對象(他們不會檢索)。 因此,要么適當地重寫hashCode() ,要么直接重寫它以return 1 這將滿足約束條件並正常工作,但是如果您開始將它們放入基於散列的集合中,則性能會很糟糕。

要解決這一點:

性能好壞?

您是否需要它,或者您不需要。 如果需要,您別無選擇。 如果您不這樣做,它將永遠不會被調用。

其他一些人提到只是返回一個常數。 如果您忘記了並將其放入基於哈希的集合中,這可能會在以后引起性能方面的混亂。 我會考慮拋出UnsupportedOperationException,這樣,如果您以后想使用它,您將很快發現,以便繼續進行正確的實現。

每當您覆蓋哈希碼時,您還需要覆蓋等於。 哈希碼必須返回相同的值以進行比較,如果相等則返回true,否則哈希圖將無法正常工作。

是。 如果可以改進默認實現,則覆蓋哈希碼。

暫無
暫無

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

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