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
从文档:
返回该对象的哈希代码值
对象此方法在以下情况下受支持:
哈希表的好处,例如
由java.util.Hashtable提供的
hashCode的总合同为:
- 当在一个过程中对同一对象多次调用时 Java应用程序的执行 hashCode方法必须一致 返回相同的整数,前提是没有 用于比较的信息 在对象上修改。这 整数不需要保持一致 从应用程序的一次执行 对同一事件的另一次执行 应用程序
- 如果根据equals(Object)方法,两个对象相等,则 在每个 这两个对象必须产生相同的结果 整数结果
- 如果两个对象根据 equals(java.lang.Object)方法,然后 在每个 这两个对象必须产生不同的结果 整数结果。但是, 程序员应该意识到 为生成不同的整数结果 不相等的对象可以提高性能 哈希表的性能
您还必须实现
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和哈希代码的建议都很到位;告诉你如何正确地做 但同样重要的要求是映射中的键必须是不可变的。如果你的班级可以改变