[英]Containment issues with HashTable class
我有 Hashtable 類的問題。 我有一個類 TmpClass 實現了一個方法 equals。 然后我創建了一個 Hashtable,並且在我的預定義 equals 方法下,兩個 TmpClass 對象是相等的。 然后我將對象作為哈希表中的鍵。 但是當我測試第二個對象是否真的包含在 Hashtable 中時,結果是“false”...
這是我的主要方法。
public static void main(String[] args){
Hashtable<TmpClass, Integer> list = new Hashtable<TmpClass, Integer>();
TmpClass v1 = new TmpClass(1);
list.put(v1, 1);
TmpClass v2 = new TmpClass(1);
if(v2.equals(v1))
System.out.println("Equals");
else System.out.println("Not equal");
if(list.containsKey(v2))
System.out.println("Contains");
else System.out.println("Not contain");
}
這是我的 TmpClass。
public class TmpClass {
private int val;
public TmpClass(int v){
val = v;
}
public boolean equals(Object o){
if(o instanceof TmpClass){
return val == ((TmpClass) o).val;
}
else return false;
}
}
javadoc里面寫得很清楚,Hashtable的方法containsKey使用Object類的方法equals來比較key。 有人解釋為什么這里不滿足繼承屬性嗎? 或者有人有解決這個問題的替代方法嗎?
這對我很有幫助。 謝謝。
您還必須實現 hashcode 方法,作為hashcode equals contract 的一部分。 它也在Hastable 規范中說明:
要從哈希表中成功存儲和檢索對象,用作鍵的對象必須實現 hashCode 方法和 equals 方法。
實施equals
是不夠的。
為了將您的類用作Map
的鍵,您還必須實現hashCode
。
這是一個例子:
@Override
public int hashCode() {
return Integer.valueOf(val).hashCode();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.