case equals方法中的java hashCode方法支持wildchar
我有一个类,它的对象将存储在hashmap hashset中
我需要为字段支持wildchar相等,因此我添加了check-in equals
方法。现在,如何基于这个参数构建hashcode方法?i、 e.如果我按照下面的代码进行计算,我将为通过equals方法的等式检查的两个对象获得不同的哈希代码
例如考虑以下类:
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);
}
}
编辑:
正如一些评论中指出的,应该有一个单独的方法来检查wildchar的平等性。这种方法的局限性是,我无法获得像set.contains
这样的方法的正确结果,因为它们在内部检查object.equals
。因此,我的set.contains
将返回false,即使我的对象通过了单独的wildchar相等方法的相等测试
# 1 楼答案
在
hashCode()
中使用相同的逻辑是不可能的,因为我们不根据比较的对象计算哈希代码,而是根据当前对象状态计算它您可以在
hashCode()
方法中返回一个常量值,但它效率不高,因此听起来不是个好主意您最初的问题来自这样一个事实,即您希望赋予一个职责,而不是设计为进入
equals()
方法:定义对象实际状态(即实际字段值)之外的相等性因此,您不应该使用
equals()
方法来执行通配符比较,而应该为其编写专用方法