我是否需要定义自己的 hash 和 equal 方法?

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;
    }
}

the String "name" variable will be enough to make sure each object of InfoName is different

如果您只想在 InfoName 中使用 name,那么只需让 String 键入 name 作为 key,因为它已经覆盖equals()hashCode() .

您需要覆盖 InfoName class 中的 equals()hashCode(),否则 JVM 如何知道您正在使用哪个 attribute/criteria 进行散列和相等性检查。

如果您确定将 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;
    }
}

基本上,您的编辑器提供了覆盖哈希码和等号的功能。看这里 Why do I need to override the equals and hashCode methods in Java?enter link description here

I think it's not necessary, since the String "name" variable will be enough to make sure each object of InfoName is different.

我建议不要使用 name 作为散列键,因为它看起来不太合适。我的意思是您可以拥有多个具有相同产品名称的对象吗?在那种情况下,你会发生很多碰撞。