必须为该对象类型的实例覆盖对象的.equals方法,以便将它们用作HashMap中的键

时间:2013-05-14 09:56:09

标签: java hashmap

我遇到了Hashmaps的麻烦。目前,我的HashMap是名为Names的枚举的HashMap,使用Key SignaturesHashMap<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方法,或者我是否朝着完全错误的方向寻找?

1 个答案:

答案 0 :(得分:3)

答案是肯定的。

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

另一种替代方法是使用替代代码替换创建KeySignature新实例的代码,该替代代码会针对给定的note,Accidental和Scale组合查找现有KeySignature实例。