Java 必须为该对象类型的实例重写对象的.equals方法才能将其用作HashMap中的键吗
我在使用Hashmaps时遇到问题。目前,my HashMap是一个名为Java 必须为该对象类型的实例重写对象的.equals方法才能将其用作HashMap中的键吗,java,hashmap,Java,Hashmap,我在使用Hashmaps时遇到问题。目前,my HashMap是一个名为名称的枚举的HashMap,使用键签名,或HashMap。目前,名称Enum存储键签名的值,或C_FLAT_MAJOR(新键签名(7,contraction.FLAT,Scale.MAJOR);。要获取给定键签名的Enum版本,我创建了上面解释的HashMap: private static final HashMap<KeySignature, Names> lookup = new HashMap<Ke
名称
的枚举的HashMap,使用键签名
,或HashMap
。目前,名称Enum存储键签名的值,或C_FLAT_MAJOR(新键签名(7,contraction.FLAT,Scale.MAJOR);
。要获取给定键签名的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);
}
}
但是,返回的值始终为null
我不知道是什么原因导致了这种情况,但似乎HashMap.get()
方法是通过引用而不是值来比较键和参数。我必须重写键签名的.equals和.hash方法,还是我的方向完全错误?答案是肯定的
如果要动态创建KeySignature
的实例,则equals
方法需要“按值”比较它们。默认的equals
实现只是测试对象是否为=
。因此,您需要让hashmap工作,您需要覆盖默认的equals
和hashcode
方法
另一种选择是,将创建新的
KeySignature
实例的代码替换为查找现有KeySignature
实例的可选代码,该实例针对给定的note、contractive和Scale组合。是的,您必须在KeySignature
public Names getCommonName() {
return Names.lookup.get(this);
}