簡體   English   中英

如果某個字段具有集合類型,如何覆蓋 equals 和 hashcode?

[英]How override equals and hashcode if some field has collection type?

如何覆蓋具有下面描述的字段的類的相等和哈希碼?

public class Cartoon {

    private String name;
    private List<CartoonCharacter> characters;

    //other code

    public boolean equals(Object o){
        // ?
    }

    public int hashCode(){
        // ?
    }

}

在 equals 中,您必須定義相等對您的對象的真正含義。 在大多數情況下,您必須在所有字段上執行 equals,對於集合,如果它們匹配,您將需要檢查它們的內容。

對於哈希碼,您可以基於您擁有的字段的哈希碼,您只需要將它們乘以不同的素數,然后對它們執行 XOR(在 Java 中用 ^ 符號表示)。 可以在此處找到有關此的更多信息: Combining Java hashcodes into a "master" hashcode

以下是您的案例的可能方法之一:

public class Cartoon {
    private String name;
    private List<String> characters;

    public boolean equals(Object o){
        if(o instanceof Cartoon){
            Cartoon cartoonToCompare = (Cartoon) o;
            return cartoonToCompare.name.equals(name) && 
                   cartoonToCompare.characters.containsAll(characters));
        }
        return false;
    }

    public int hashCode(){
        return 991 * name.hashCode() ^ 997 * characters.size();
    }

}

暫無
暫無

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

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