我有一个看起来像这样的哈希表:
Hashtable<Mapping, Integer> mappingCount = new Hashtable<Mapping, Integer>();
我想使用这段代码:
if (mappingCount.get(currentMapping) != null)
mappingCount.put(currentMapping, mappingCount.get(currentMapping) + 1);
else
mappingCount.put(currentMapping, 1);
为了能够从哈希表中获取值,对于类Mapping
我做了以下事情:
@Override
public boolean equals(Object obj) {
return ((Mapping)obj).mappingXML.equals(this.mappingXML);
}
但是,自 mappingCount.get(currentMapping)
以来,这并不能解决问题总是导致 null
.为确保没有出错,我执行了以下操作:
if (aaa.contains(currentMapping.getMappingXML()))
System.out.println("found it!");
else
aaa.add(currentMapping.getMappingXML());
哪里aaa
是List<String> aaa = new ArrayList<String>()
.当然,found it
被打印了很多次。我做错了什么?
最佳答案
您还需要覆盖 hashCode() 方法。
来自JavaDocs :
To successfully store and retrieve objects from a hashtable, the objects used as keys must implement the hashCode method and the equals method.
这样做的原因是 Hashtable 使用 hashCode 作为初步测试来查看两个对象是否相等。如果 hashCode 匹配,则使用 equals 检查冲突。
hashCode()的默认实现返回对象的内存地址,对于两个相等的对象,它们的hashcode也必须相等。
另请查看 hashCode() 的总契约(Contract).
关于Java:在查找哈希表的键时,重写 equals 方法不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6031922/