我正在尝试从hashmap中检索一个值。键是TransitionKey对象,它们实现了equals和hashcode。当我使用equals(...)来比较我想要查找的键和hashmap中的当前键时,它返回true,但是get返回null并且containsKey返回false。自从将其添加到hashmap以来,我没有以任何方式修改密钥。有人可以帮忙吗?
TransitionKey current = new TransitionKey(this.currentState, inputSymbol);
for(TransitionKey tk: transitions.keySet()) {
System.out.println(tk.equals(current)); // True (only one key in table)
System.out.println(transitions.containsKey(current)); // false
String value = transitions.get(tk).toString(); // null
}
在TransitionKey类中:
/**
* @override
*/
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof TransitionKey)) return false;
TransitionKey transitionKey = (TransitionKey) o;
return (state.equals(transitionKey.state)) && (symbol==transitionKey.symbol);
}
/**
* @override
*/
public int hashcode() {
int result = (int)symbol;
result = result*31 + state.hashCode();
return result;
}
答案 0 :(得分:2)
您尚未覆盖hashCode
,您已创建了新的hashcode
方法(请注意c
与C
)。
将您的代码更改为
@Override
public int hashCode() {
int result = (int)symbol;
result = result*31 + state.hashCode();
return result;
}
它应该按预期工作。
请注意,如果您没有注释掉@Override
注释,则会收到有用的编译器错误。