從哈希映射中檢索值時遇到問題。 HashMap中聲明如下:Java - 從哈希映射檢索對象
HashMap<TRpair,A> aTable = new HashMap<TRpair,A>();
我然後把112個的值到圖如下:
aTable.put(new TRpair(new T(<value>),new Integer(<value>)),new Ai());
其中,Ai是4子類擴展A.
我然後任一項繼續檢查地圖中的值是什麼,如下:
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))));
空輸出,儘管上面的代碼片段證實了確實有在地圖上一個條目與正是這種關鍵。
如果有幫助,類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();
}
}
了equals()和toString()中的每個的艾的方法(延伸的),並在T類被類似地重寫和似乎表現得像預期的那樣。
爲什麼從hashmap aTable輸出的值爲null,之前已經確認相應鍵的值確實在映射中?
非常感謝,
Froskoy。
您需要重寫'TRpair'中的'hashCode()'方法,否? –
爲什麼? equals()是否被覆蓋是不夠的? – Froskoy
如果更多對象具有相同的值(和狀態),則需要重寫'hashCode()'以維持相等性。更多Hashable表通過散列檢查一致性和相等性。 –