hashCode 方法以防 equals 方法支持 wildchar
hashCode method in case equals method supports wildchar
我有一个class,它的对象会存储在hashmap,hashset中。
我需要支持字段的通配符相等性,因此我添加了检查 equals
方法。现在,如何基于此参数构建哈希码方法?即,如果我按照下面的代码所示进行计算,我将为通过 equals 方法的相等性检查的 2 个对象获得不同的哈希码。
例如考虑以下 class:
public class Person {
private String fname = "";
private String lname = "";
private String profession = "";
// getters & setters
@Override
public boolean equals(Object obj) {
if (fname == null) {
if (other.fname != null)
return false;
} else if (!fname.equals(other.fname) && !other.fname.equals("*") && !fname.equals("*"))
return false;
return true;
// similar for other fields
}
@Override
public int hashCode() {
return Objects.hashCode(this.fname, this.lname , this.profession);
}
}
编辑:
正如某些评论中指出的那样,应该有一个单独的方法来检查通配符是否相等。这种方法的局限性是我无法获得像 set.contains
这样的方法的正确结果,因为它们会在内部检查 object.equals
。所以我的 set.contains
将 return 为假,即使我的对象通过了我单独的 wildchar 相等方法的相等测试。
不可能在 hashCode()
中使用相同的逻辑,因为 我们不根据比较对象计算哈希码,而是根据当前对象状态计算哈希码.
您可以在 hashCode()
方法中 return 一个常量值,但效率不高,因此这听起来不是个好主意。
您最初的问题来自于这样一个事实,即您想赋予并非设计为 equals()
方法的责任:定义超出对象实际状态(即实际字段值)的相等性。
所以你不应该使用 equals()
方法来执行通配符比较,而应该写一个专用的方法。
我有一个class,它的对象会存储在hashmap,hashset中。
我需要支持字段的通配符相等性,因此我添加了检查 equals
方法。现在,如何基于此参数构建哈希码方法?即,如果我按照下面的代码所示进行计算,我将为通过 equals 方法的相等性检查的 2 个对象获得不同的哈希码。
例如考虑以下 class:
public class Person {
private String fname = "";
private String lname = "";
private String profession = "";
// getters & setters
@Override
public boolean equals(Object obj) {
if (fname == null) {
if (other.fname != null)
return false;
} else if (!fname.equals(other.fname) && !other.fname.equals("*") && !fname.equals("*"))
return false;
return true;
// similar for other fields
}
@Override
public int hashCode() {
return Objects.hashCode(this.fname, this.lname , this.profession);
}
}
编辑:
正如某些评论中指出的那样,应该有一个单独的方法来检查通配符是否相等。这种方法的局限性是我无法获得像 set.contains
这样的方法的正确结果,因为它们会在内部检查 object.equals
。所以我的 set.contains
将 return 为假,即使我的对象通过了我单独的 wildchar 相等方法的相等测试。
不可能在 hashCode()
中使用相同的逻辑,因为 我们不根据比较对象计算哈希码,而是根据当前对象状态计算哈希码.
您可以在 hashCode()
方法中 return 一个常量值,但效率不高,因此这听起来不是个好主意。
您最初的问题来自于这样一个事实,即您想赋予并非设计为 equals()
方法的责任:定义超出对象实际状态(即实际字段值)的相等性。
所以你不应该使用 equals()
方法来执行通配符比较,而应该写一个专用的方法。