Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 哈希表类的包含问题_Java_Hashmap_Hashtable_Equals_Contains - Fatal编程技术网

Java 哈希表类的包含问题

Java 哈希表类的包含问题,java,hashmap,hashtable,equals,contains,Java,Hashmap,Hashtable,Equals,Contains,我对Hashtable类有一个问题。我有一个类TmpClass实现了一个方法equals。然后我创建一个哈希表,在我的predifined equals方法下,TmpClass的两个对象相等。然后我将对象的名称作为键放入哈希表中。 但是当我测试第二个对象是否真的包含在哈希表中时,结果是“false” 这是我的主要方法 public static void main(String[] args){ Hashtable<TmpClass, Integer> list =

我对Hashtable类有一个问题。我有一个类TmpClass实现了一个方法equals。然后我创建一个哈希表,在我的predifined equals方法下,TmpClass的两个对象相等。然后我将对象的名称作为键放入哈希表中。 但是当我测试第二个对象是否真的包含在哈希表中时,结果是“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");
}
javadoc中清楚地写到,Hashtable的containsKey方法使用Object类的方法equals来比较键。有人能解释为什么继承财产在这里不能得到满足吗?还是有人有别的办法来解决这个问题


这将对我很有帮助。谢谢。

您还必须实现hashcode方法,作为测试的一部分。此外,还规定:

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


仅实现
等于
是不够的

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

以下是一个例子:

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

可能与HashTable的containsKey()代码重复:if((e.hash==hash)和&e.key.equals(key))。
@Override
public int hashCode() {
    return Integer.valueOf(val).hashCode();
}