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