如果equals方法支持wildchar,则为hashCode方法

时间:2018-10-01 07:06:08

标签: java equals hashcode

我有一个类,其对象将存储在哈希表hashset中。

我需要支持字段的通配符相等,因此我添加了equals方法中的check。现在,如何基于此参数构建哈希码方法?即,如果我按照下面的代码所示进行计算,则将为通过我的equals方法的相等性检查的2个对象获得不同的哈希码。

例如考虑以下课程:

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时,我将无法获得正确的结果。因此,即使我的对象通过了单独的wildchar相等方法的相等性测试,我的set.contains也会返回false。

1 个答案:

答案 0 :(得分:4)

无法在hashCode()中使用相同的逻辑,因为我们不会根据比较对象来计算哈希码,而是根据当前对象状态来计算哈希码。
您可以在hashCode()方法中返回一个常量值,但效率不高,因此听起来不是个好主意。
您最初的问题来自于这样一个事实,您想要承担一个并非旨在纳入equals()方法中的责任:定义超出对象实际状态(即实际字段值)的相等性。
因此,您不应使用equals()方法执行通配符比较,而应编写专用的方法。