我有一个将自定义对象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方法中,则会出现编译器错误和正确的错误消息。

07-26 03:52