我在使用Hashmaps时遇到麻烦。当前,我的HashMap是一个名为Names
的枚举的HashMap,使用键Key Signatures
或HashMap<KeySignature, Names>
。当前,名称枚举存储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方法,还是我朝完全错误的方向看? 最佳答案
答案是肯定的。
如果要动态创建KeySignature
的实例,则equals
方法需要“按值”比较它们。 equals
的默认实现只是测试对象是否为==
。因此,您需要使哈希图起作用,并且需要覆盖默认的equals
和hashcode
方法。
另一种替代方法是用替代代码替换创建KeySignature
新实例的代码,该替代代码针对给定的音符,意外和小数组合查找现有的KeySignature
实例。