Java:在查找哈希表的键时,重写 equals 方法不起作用?

标签 java

我有一个看起来像这样的哈希表:

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());

哪里aaaList<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/

相关文章:

java - 读取pdf电子书的内容并相应地分割pdf文件

java - PHP 到 Java(使用 PtoJ)

java - ArchUnit:检查包是否相互依赖的最优雅的方法

java - 想开发一款可以自动回复收到的短信的app

java - 应用程序默认凭据无法创建 Google App Engine 服务帐户凭据

java - 具有多个调度程序的 Spring Java Config

java - 有没有办法在对象名称中使用变量?

java - Web 服务不工作 (Android Studio)

java - sudo R CMD javareconf 解决方案不起作用

java - 将应用程序属性覆盖为未定义/未设置