簡體   English   中英

我需要創建自己的哈希和相等方法嗎?

[英]Do I need to create my own hash and equal methods?

class EventManager{
    public String unique_ID;
    public List<Object> infoList;

    public EventManager(String ID, List<Object> infoList){
        this.unique_ID = ID;
        this.infoList = infoList;
    }
}

如果這個類用作映射鍵,我是否需要實現自己的 hashcode 和 equal() 方法?

如果需要,只需散列 unique_ID 就足夠了嗎? 謝謝。

謝謝。

如果您不定義自己的哈希碼,我相信它會使用對象的地址。 因此,如果您創建兩個具有相同 id 的實例,它們將不會散列到同一個存儲桶。 您可能想使用 id 來表示平等。 作為旁注,除非您可以保證不變性,否則請確保不要在相等或散列中使用 List。

默認的 .equals 和 .hashCode 如何為我的類工作?

除非您想覆蓋hashCode和 equals 的值以賦予它們不同的behaviour

如果沒有,您可以只使用默認值,並且每個不同的對象都將具有不同的hashCode ,在某種程度上由 JVM 或多或少地保證。

您只需要覆蓋equals ,例如,如果您希望能夠在滿足某些條件時說兩個對象相同(例如,只有unique_ID相同)。

如果您確實覆蓋了equals ,那么您必須覆蓋hashCode ,以尊重對象合同:

Object 類的 equals 方法實現了對象上最有區別的可能等價關系; 也就是說,對於任何非空引用值 x 和 y,當且僅當 x 和 y 引用同一個對象(x == y 的值為 true)時,此方法才返回 true。

請注意,每當重寫此方法時,通常都需要重寫 hashCode 方法,以維護 hashCode 方法的一般約定,即相等的對象必須具有相等的哈希碼。

http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)

明白如果你不覆蓋equals,那么兩個實例只有在它們實際上是相同的實例(即相等的地址)時才會相等。 如果您希望包含相等字段的實例被視為相等,則需要實現您自己的版本。

如果您覆蓋 equal 那么您也必須覆蓋哈希碼,以確保兩個相等的實例返回相同的哈希碼。 不這樣做將導致 HashMap 等失敗。

請注意,哈希碼始終返回 6 或其他一些固定值是完全合法的(盡管很愚蠢)。 不能做的是為相同的實例返回兩個不同的哈希碼值。

暫無
暫無

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

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