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();
}
我的哈希表有问题 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();
}