Java 必须为该对象类型的实例重写对象的.equals方法才能将其用作HashMap中的键吗

Java 必须为该对象类型的实例重写对象的.equals方法才能将其用作HashMap中的键吗,java,hashmap,Java,Hashmap,我在使用Hashmaps时遇到问题。目前,my HashMap是一个名为名称的枚举的HashMap,使用键签名,或HashMap。目前,名称Enum存储键签名的值,或C_FLAT_MAJOR(新键签名(7,contraction.FLAT,Scale.MAJOR);。要获取给定键签名的Enum版本,我创建了上面解释的HashMap: private static final HashMap<KeySignature, Names> lookup = new HashMap<Ke

我在使用Hashmaps时遇到问题。目前,my HashMap是一个名为
名称
的枚举的HashMap,使用
键签名
,或
HashMap
。目前,名称Enum存储键签名的值,或
C_FLAT_MAJOR(新键签名(7,contraction.FLAT,Scale.MAJOR);
。要获取给定键签名的Enum版本,我创建了上面解释的HashMap:

private static final HashMap<KeySignature, Names> lookup = new HashMap<KeySignature, Names>();
static {
    for (Names name : Names.values()){
    lookup.put(new KeySignature(name.getKeySig()), name);

    }
}
但是,返回的值始终为null

我不知道是什么原因导致了这种情况,但似乎
HashMap.get()
方法是通过引用而不是值来比较键和参数。我必须重写键签名的.equals和.hash方法,还是我的方向完全错误?

答案是肯定的

如果要动态创建
KeySignature
的实例,则
equals
方法需要“按值”比较它们。默认的
equals
实现只是测试对象是否为
=
。因此,您需要让hashmap工作,您需要覆盖默认的
equals
hashcode
方法


另一种选择是,将创建新的
KeySignature
实例的代码替换为查找现有
KeySignature
实例的可选代码,该实例针对给定的note、contractive和Scale组合。

是的,您必须在
KeySignature
public Names getCommonName() {
    return Names.lookup.get(this);

    }