1

我在使用 Hashmap 时遇到问题。目前,我的 HashMap 是一个名为 的枚举的 HashMap Names,使用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 方法,还是我的方向完全错误?

4

1 回答 1

3

答案是肯定的。

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

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

于 2013-05-14T10:42:37.250 回答