我有一个将自定义对象TokenDocumentPair
映射到Double
的HashMap。 TokenDocumentPair
如下所示:
static class TokenDocumentPair {
int documentNum;
String token;
public TokenDocumentPair(String token, int documentNum) {
this.token = token;
this.documentNum = documentNum;
}
public boolean equals(TokenDocumentPair other) {
return (this.documentNum == other.documentNum && this.token.equals(other.token));
}
public int hashCode() {
int result = 1;
result = 37 * result + Objects.hashCode(this.documentNum);
result = 37 * result + Objects.hashCode(this.token);
return result;
}
public String toString() {
return String.format("[Document #%s, Token: %s]", documentNum, token);
}
}
问题是,当我创建
TokenDocumentPair pair1 = new TokenDocumentPair("hello", 1)
时,将其存储到HashMap<TokenDocumentPair, Double> map
中,并尝试使用TokenDocumentPair pair2 = new TokenDocumentPair("hello", 1)
进行获取,它将返回null
。但是,我的印象是,由于我的哈希码和equals方法匹配并且基于存储的两个字段,因此哈希映射将能够找到原始的pair1
并将其值返回给我。TokenDocumentPair pair1 = new TokenDocumentPair("hello", 1);
TokenDocumentPair pair2 = new TokenDocumentPair("hello", 1);
assert pair1.hashCode() == pair2.hashCode(); // ok
assert pair1.equals(pair2); // ok
HashMap<TokenDocumentPair, Double> map = new HashMap<>();
map.put(pair1, 0.0);
map.get(pair2); // null
map.containsKey(pair2); // false
我在这里做错了什么?
最佳答案
equals
方法不会被覆盖。您已经超载了。
要覆盖的方法Object#equals
的签名必须如下所示:
@Override
public boolean equals(Object o) {
//...
}
为了确保您覆盖某个方法,在声明该方法时请使用
@Override
批注。如果将此注释添加到当前的equals
方法中,则会出现编译器错误和正确的错误消息。