从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个子类中的任何一个。
然后我继续检查地图中的值,如下所示:
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++;
}
我在结尾处保持值112,正如人们所期望的那样,并且正如预期的那样,对于一个条目,相等性测试打印为真。
但是,当我这样做时
System.out.println(aTable.get(new TRpair(new T("!"), new Integer(10))));
输出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()方法都被类似地覆盖,并且看起来像预期的那样。
为什么从hashmap aTable输出的值为null,之前已经确认相应键的值确实在地图中?
非常感谢,
Froskoy。
答案 0 :(得分:3)
哈希集合的键/元素,但如果覆盖了euqals则覆盖hashCode()。
你可以使用。
public int hashCode() {
return t.hashCode() * 31 ^ r.hashCode();
}
BTW:从您的代码中可以看出,Integer r
不能null
,在这种情况下使用int r
更有意义。
请注意,通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等的对象必须具有相同的哈希代码。
答案 1 :(得分:1)
IIRC hashmap按hashCode()
查找而不是相等,并且由于您没有实现哈希码,因此使用与对象指针相等一致的默认实现 -
你需要实现适当的哈希码函数,它考虑“T”参数以及整数(或不是)
优良作法是hashCode()和equals()是一致的,但如果你知道自己在做什么,那么在结构上不是必需的。