我有一个类,它的对象将存储在 hashmap、hashset 中。我需要支持字段的通配符相等性,因此我添加了该签入equals方法。现在,如何基于此参数构建我的哈希码方法?即,如果我按照下面的代码进行计算,我将获得 2 个通过我的 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); }}编辑:正如一些评论中指出的那样,应该有一个单独的方法来检查通配符是否相等。这种方法的限制是我将无法获得正确的结果,就像set.contains他们在object.equals内部检查一样。因此set.contains,即使我的对象通过了单独的通配符相等方法的相等测试,我也会返回 false。
1 回答
浮云间
TA贡献1829条经验 获得超4个赞
在 in 中使用相同的逻辑hashCode()
是不可能的,因为我们不根据比较对象计算哈希码,而是根据当前对象 state 计算它。
您可以在该hashCode()
方法中返回一个常量值,但效率不高,因此听起来不是一个好主意。
您最初的问题来自这样一个事实,即您想要赋予一个并非设计为该equals()
方法的责任:定义超出对象实际状态(即实际字段值)的相等性。
因此您不应该使用该equals()
方法来执行通配符比较,而应为其编写专用方法。
添加回答
举报
0/150
提交
取消