HashTable 的包含问题 class

Containment issues with HashTable class

我的哈希表有问题 class。我有一个 class TmpClass 实现了一个方法 equals。然后我创建一个 Hashtable,并且 TmpClass 的两个对象在我预定义的 equals 方法下是相等的。然后我将对象作为哈希表中的键。 但是当我测试第二个对象是否真的包含在哈希表中时,结果是 "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方法class来比较key的。有人解释为什么这里不满足继承 属性 吗?或者有人有解决这个问题的替代方法吗?

这对我很有帮助。谢谢

您还必须实施 hashcode 方法,作为 hashcode equals contract. It's also stated in the Hastable spec:

的一部分

To successfully store and retrieve objects from a hashtable, the objects used as keys must implement the hashCode method and the equals method.

实施 equals 还不够。

为了将您的 class 用作 Map 中的键,您还必须实施 hashCode

这里有一个例子:

@Override
public int hashCode() {
    return Integer.valueOf(val).hashCode();
}