Java:重写equals方法不会';在查找哈希表的键时,是否不执行此操作?

Java:重写equals方法不会';在查找哈希表的键时,是否不执行此操作?,java,Java,我有一个如下所示的哈希表: Hashtable<Mapping, Integer> mappingCount = new Hashtable<Mapping, Integer>(); 为了能够从哈希表中获取值,对于类映射,我执行了以下操作: @Override public boolean equals(Object obj) { return ((Mapping)obj).mappingXML.equals(this.mappingXML); } if (a

我有一个如下所示的哈希表:

Hashtable<Mapping, Integer> mappingCount = new Hashtable<Mapping, Integer>();
为了能够从哈希表中获取值,对于类
映射
,我执行了以下操作:

@Override
public boolean equals(Object obj) {
    return ((Mapping)obj).mappingXML.equals(this.mappingXML);
}
if (aaa.contains(currentMapping.getMappingXML()))
    System.out.println("found it!");
else
    aaa.add(currentMapping.getMappingXML());
但是,这并不能起到作用,因为
mappingCount.get(currentMapping)
总是导致
null
。为了确保没有问题,我做了以下几点:

@Override
public boolean equals(Object obj) {
    return ((Mapping)obj).mappingXML.equals(this.mappingXML);
}
if (aaa.contains(currentMapping.getMappingXML()))
    System.out.println("found it!");
else
    aaa.add(currentMapping.getMappingXML());

其中
aaa
List aaa=new ArrayList()
。当然,
发现它
被打印了很多次。我做错了什么?

您还需要重写hashCode()方法

从:

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

原因是Hashtable使用hashCode作为初步测试,以查看两个对象是否相等。如果hashCode匹配,那么它将使用equals检查冲突

hashCode()的默认实现返回对象的内存地址,对于相等的两个对象,它们的hashCode也必须相等


还可以查看的通用合同。

您还需要重写hashCode()方法

从:

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

原因是Hashtable使用hashCode作为初步测试,以查看两个对象是否相等。如果hashCode匹配,那么它将使用equals检查冲突

hashCode()的默认实现返回对象的内存地址,对于相等的两个对象,它们的hashCode也必须相等


另外,请查看总合同。

无论何时覆盖
equals
,都必须覆盖
hashCode

无论何时覆盖
equals
,都必须覆盖
hashCode

也需要覆盖
hashCode

从文档:

返回该对象的哈希代码值 对象此方法在以下情况下受支持: 哈希表的好处,例如 由java.util.Hashtable提供的

hashCode的总合同为:

  • 当在一个过程中对同一对象多次调用时 Java应用程序的执行 hashCode方法必须一致 返回相同的整数,前提是没有 用于比较的信息 在对象上修改。这 整数不需要保持一致 从应用程序的一次执行 对同一事件的另一次执行 应用程序
  • 如果根据equals(Object)方法,两个对象相等,则 在每个 这两个对象必须产生相同的结果 整数结果
  • 如果两个对象根据 equals(java.lang.Object)方法,然后 在每个 这两个对象必须产生不同的结果 整数结果。但是, 程序员应该意识到 为生成不同的整数结果 不相等的对象可以提高性能 哈希表的性能
只要合理可行, 类定义的hashCode方法 对象不返回不同的整数 用于不同的对象。(这是 通常通过转换 对象的内部地址 变成一个整数,但是这个 实现技术并非如此 JavaTM编程所要求的 语言。)


您还需要重写
hashCode

从文档:

返回该对象的哈希代码值 对象此方法在以下情况下受支持: 哈希表的好处,例如 由java.util.Hashtable提供的

hashCode的总合同为:

  • 当在一个过程中对同一对象多次调用时 Java应用程序的执行 hashCode方法必须一致 返回相同的整数,前提是没有 用于比较的信息 在对象上修改。这 整数不需要保持一致 从应用程序的一次执行 对同一事件的另一次执行 应用程序
  • 如果根据equals(Object)方法,两个对象相等,则 在每个 这两个对象必须产生相同的结果 整数结果
  • 如果两个对象根据 equals(java.lang.Object)方法,然后 在每个 这两个对象必须产生不同的结果 整数结果。但是, 程序员应该意识到 为生成不同的整数结果 不相等的对象可以提高性能 哈希表的性能
只要合理可行, 类定义的hashCode方法 对象不返回不同的整数 用于不同的对象。(这是 通常通过转换 对象的内部地址 变成一个整数,但是这个 实现技术并非如此 JavaTM编程所要求的 语言。)


您还必须实现
hashcode()

例如:

public class Employee{
    int        employeeId;
    String     name;
    Department dept;

    // other methods would be in here 

    @Override
    public int hashCode() {
        int hash = 1;
        hash = hash * 17 + employeeId;
        hash = hash * 31 + name.hashCode();
        hash = hash * 13 + (dept == null ? 0 : dept.hashCode());
        return hash;
    }
}

您还必须实现
hashcode()

例如:

public class Employee{
    int        employeeId;
    String     name;
    Department dept;

    // other methods would be in here 

    @Override
    public int hashCode() {
        int hash = 1;
        hash = hash * 17 + employeeId;
        hash = hash * 31 + name.hashCode();
        hash = hash * 13 + (dept == null ? 0 : dept.hashCode());
        return hash;
    }
}

所有正确覆盖equals和hash代码的建议都是正确的;告诉你如何正确地做


但同样重要的要求是映射中的键必须是不可变的。如果您的类可以更改其值,那么在将其添加到映射后,equals和hash代码可以更改;灾难接踵而至。

所有正确覆盖equals和哈希代码的建议都很到位;告诉你如何正确地做

但同样重要的要求是映射中的键必须是不可变的。如果你的班级可以改变