簡體   English   中英

我是否需要定義自己的哈希和相等的方法?

[英]Whether I need to define my own hash and equal method?

如果我需要使用InfoName作為HashMapkey ,我是否需要定義自己的hashCode()equals()方法? 我認為沒有必要,因為String name變量足以確保InfoName每個對象都不同。

public class InfoName {
    enum Type {
        company, product;
    }

    public String name;
    public Type type;

    public InfoName(String name, Type type) {
        this.name = name;
        this.type = type;
    }
}

String“name”變量足以確保InfoName的每個對象都不同

如果您只想在InfoName使用該name ,那么只需將String type name作為key因為它已經覆蓋了equals()hashCode()

要么

您需要覆蓋InfoName類中的equals()hashCode() ,否則JVM將如何知道您用於散列和相等性檢查的屬性/條件。

如果您確定將InfoName作為密鑰,則需要覆蓋兩者。 你有類似的東西

public class Test {
    enum Type {
        company, product;
    }

    public String name;
    public Type type;

    public Test(String name, Type type) {
        this.name = name;
        this.type = type;
    }

    @Override
    public boolean equals(Object o) {//or do what you like
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Test test = (Test) o;

        if (!name.equals(test.name)) return false;
        if (type != test.type) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = name.hashCode();
        result = 31 * result + type.hashCode();
        return result;
    }
}

基本上,您的編輯器提供了重寫hashcode和equals的功能。 看看這里為什么我需要覆蓋Java中的equals和hashCode方法? 在此輸入鏈接描述

我認為沒有必要,因為String“name”變量足以確保InfoName的每個對象都不同。

我建議不要使用name作為哈希鍵,因為它似乎是一個糟糕的候選人。 我的意思是你有多個具有相同產品名稱的對象嗎? 在這種情況下,你會遇到很多碰撞。

暫無
暫無

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

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