gpt4 book ai didi

java - 即使 hashCode/equals 被重写,HashMap 也返回 null

转载 作者:行者123 更新时间:2023-11-29 07:40:39 24 4
gpt4 key购买 nike

我有一个映射自定义对象的 HashMap TokenDocumentPairDouble . 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 .然而,我的印象是,由于我的 hashcode 和 equals 方法匹配并且基于存储的两个字段,hash 映射将能够找到原始的 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 方法,您将收到编译器错误和正确的错误消息。

关于java - 即使 hashCode/equals 被重写,HashMap 也返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30631513/

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