我在使用Hashmaps时遇到麻烦。当前,我的HashMap是一个名为Names的枚举的HashMap,使用键Key SignaturesHashMap<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的默认实现只是测试对象是否为==。因此,您需要使哈希图起作用,并且需要覆盖默认的equalshashcode方法。

另一种替代方法是用替代代码替换创建KeySignature新实例的代码,该替代代码针对给定的音符,意外和小数组合查找现有的KeySignature实例。

07-25 22:37