繁体   English   中英

HashTable 类的包含问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM