【问题标题】:Must the .equals method for objects be overriden for instances of that object type in order for them to be used as keys in a HashMap必须为该对象类型的实例覆盖对象的 .equals 方法,以便将它们用作 HashMap 中的键
【发布时间】:2013-05-14 09:56:08
【问题描述】:

我在使用 Hashmap 时遇到问题。目前,我的 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);

    }

但是,返回的值始终为空。

我不知道是什么原因造成的,但似乎HashMap.get() 方法是通过引用而不是值来比较键和参数。我是否必须重写 KeySignature 的 .equals 和 .hash 方法,还是我的方向完全错误?

【问题讨论】:

  • 是的,你必须在 KeySignature 中定义很多 equals

标签: java hashmap


【解决方案1】:

答案是肯定的。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 2022-12-31
    相关资源
    最近更新 更多