簡體   English   中英

即使我重寫equals(Object o),HashSet也不包含我的自定義對象

[英]HashSet doesn't contain my custom object even though I override equals(Object o)

為什么這個程序的輸出是false 我期待true n對象初始化與我正在檢查的相同的字符串。

public class Test {
    public static void main(String[] args) {
        Name n = new Name("jyoti", "meher");
        Set<Name> s = new HashSet();
        s.add(n);
        System.out.println(s.contains(new Name("jyoti", "meher")));
    }
}

class Name {
    String name, title;

    public Name(String name, String title) {
        this.name = name;
        this.title = title;
    }

    public boolean equals(Object o) {
        if (!(o instanceof Name)) {

            return false;
        }
        Name n = (Name) o;
        return n.name.equals(name) && n.title.equals(title);
    }
}

你也必須覆蓋hashCode() ,而不僅僅是equals()

要獲得正確的輸出true,您需要覆蓋Name類中的hashCode()方法

如果兩個對象具有不同的hashCode值,那么它們將被HashSet視為不相等。

每當你重寫equals時,你也應該覆蓋hashCode()以確保它是一致的。 在處理依賴哈希代碼分配對象的HashSetHashMap時,這一點尤其重要。

您可以使用hashCode的以下(非最佳)實現來使用您的代碼:

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

這將強制HashSet在比較Name對象時使用equals()方法。 如果在生成哈希碼時使用了nametitle ,則必須使用equals方法的情況會更少。

在Name類中,equal和hashcode方法都應該覆蓋。所以輸出將為true。

您應該重寫equals()和hashcode()方法,以確保合同得到滿足,以便將對象用作HashSet和HashMap等實現中的鍵。

您已正確覆蓋了等號。 您也可以覆蓋哈希碼,如下所示

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result
            + ((name == null) ? 0 : name.hashCode());
    result = prime * result + id;
    result = prime * result
            + ((title == null) ? 0 : title.hashCode());
    return result;
}  

覆蓋哈希碼有助於根據哈希碼將對象存儲在不同的槽中,從而加快搜索速度。

希望這可以幫助

暫無
暫無

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

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