从 HashMap 中检索值时遇到问题。 HashMap 声明如下:
HashMap<TRpair,A> aTable = new HashMap<TRpair,A>();
然后我将 112 个值放入映射中,如下所示:
aTable.put(new TRpair(new T(<value>),new Integer(<value>)),new Ai());
其中 Ai 是扩展 A 的 4 个子类中的任何一个。
然后我继续检查 map 中的值,如下所示:
int i = 0;
for (Map.Entry<TRpair,A> entry : aTable.entrySet()) {
System.out.println(entry.getKey().toString() + " " + entry.getValue().toString());
System.out.println(entry.getKey().equals(new TRpair(new T("!"),new Integer(10))));
i++;
}
i 最后的值是 112,正如人们所期望的那样,并且正如预期的那样,相等性测试恰好为一个条目打印 true。
但是,当我这样做的时候
System.out.println(aTable.get(new TRpair(new T("!"), new Integer(10))));
尽管上面的代码片段确认 map 中确实有一个条目恰好具有此键,但输出为 null。
如果有帮助,类 TRpair 声明如下:
public class TRpair {
private final T t;
private final Integer r;
protected TRpair(Integer r1, T t1) {
terminal = t1;
row = r1;
}
protected TRpair(T t1, Integer r1) {
t = t1;
r = r1;
}
@Override
public boolean equals(Object o) {
TRpair p = (TRpair)o;
return (p.t.equals(t)) && (p.r.equals(r));
}
@Override
public String toString() {
StringBuilder sbldr = new StringBuilder();
sbldr.append("(");
sbldr.append(t.toString());
sbldr.append(",");
sbldr.append(r.toString());
sbldr.append(")");
return sbldr.toString();
}
}
每个 Ai(扩展 A)和 T 类中的 equals() 和 toString() 方法都被类似地覆盖并且表现得像预期的那样。
为什么之前已经确认对应键的值确实在map中,hashmap aTable输出的值是null?
非常感谢,
弗罗斯科伊。
最佳答案
哈希集合的键/元素,但如果 euqals 被覆盖,则覆盖 hashCode()。
你可以使用。
public int hashCode() {
return t.hashCode() * 31 ^ r.hashCode();
}
顺便说一句:从您的代码看来,Integer r
不能为 null
,在这种情况下使用 int r
更有意义。
Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.
关于Java - 从 HashMap 中检索对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12458894/