为了账号安全,请及时绑定邮箱和手机立即绑定

如果 equals 方法支持通配符,则 hashCode 方法

如果 equals 方法支持通配符,则 hashCode 方法

慕慕森 2021-10-20 15:58:33
我有一个类,它的对象将存储在 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()方法来执行通配符比较,而应为其编写专用方法。

查看完整回答
反对 回复 2021-10-20
  • 1 回答
  • 0 关注
  • 150 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信