【问题标题】:Containment issues with HashTable classHashTable 类的包含问题
【发布时间】:2016-03-28 14:31:52
【问题描述】:

我对 Hashtable 类有疑问。我有一个实现方法 equals 的类 TmpClass。然后我创建一个 Hashtable,在我预定义的 equals 方法下,两个 TmpClass 对象相等。然后我把对象作为哈希表中的键。 但是当我测试第二个对象是否真的包含在哈希表中时,结果是“假”...

这是我的主要方法。

    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。有人解释为什么这里不满足继承属性吗?或者有人有其他方法来解决这个问题吗?

这对我很有帮助。谢谢。

【问题讨论】:

标签: java hashmap hashtable equals contains


【解决方案1】:

实现equals 是不够的。

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

这是一个例子:

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

【讨论】:

    【解决方案2】:

    您还必须实现 hashcode 方法,作为hashcode equals contract 的一部分。 Hastable spec中也有说明:

    要成功地从哈希表中存储和检索对象,用作键的对象必须实现 hashCode 方法和 equals 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 2011-02-09
      • 2013-10-30
      相关资源
      最近更新 更多