gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:43:48 25 4
gpt4 key购买 nike

我在使用 Hashmap 时遇到了问题。目前,我的 HashMap 是一个名为 Names 的枚举的 HashMap。 , 使用 key Key Signatures , 或 HashMap<KeySignature, Names> .目前,Name Enum 存储 KeySignatures 的值,或 C_FLAT_MAJOR(new KeySignature(7, Accidental.FLAT, Scale.MAJOR); .为了获得给定 KeySignature 的枚举版本,我创建了上面解释的 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 的枚举版本时,我调用了一个位于 KeySignature 类中的方法:

public Names getCommonName() {
return Names.lookup.get(this);

}

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

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

最佳答案

答案是肯定的。

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

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

关于java - 必须为该对象类型的实例覆盖对象的 .equals 方法,以便将它们用作 HashMap 中的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16540152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com