我遇到了Hashmaps的麻烦。目前,我的HashMap是名为Names
的枚举的HashMap,使用Key Signatures
或HashMap<KeySignature, Names>
的键。目前,Name Enum存储KeySignatures或C_FLAT_MAJOR(new KeySignature(7, Accidental.FLAT, Scale.MAJOR);
的值。为了获得给定KeySignature的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);
}
}
因此,当我需要检查KeySignature的Enum版本是什么时,我调用一个位于KeySignature类中的方法:
public Names getCommonName() {
return Names.lookup.get(this);
}
但是,返回的值始终为null。
我无法弄清楚导致这种情况的原因,但似乎HashMap.get()
方法是通过引用而不是值来比较键和参数。我是否必须覆盖KeySignature的.equals和.hash方法,或者我是否朝着完全错误的方向寻找?
答案 0 :(得分:3)
答案是肯定的。
如果您要动态创建KeySignature
的实例,则equals
方法需要“按值”比较它们。 equals
的默认实现只是测试对象是否为==
。因此,您需要让hashmap生效,您需要覆盖默认的equals
AND hashcode
方法。
另一种替代方法是使用替代代码替换创建KeySignature
新实例的代码,该替代代码会针对给定的note,Accidental和Scale组合查找现有KeySignature
实例。