java - hashCode 方法以防 equals 方法支持 wildchar

标签 java equals hashcode

我有一个类,它的对象会存储在hashmap、hashset中。

我需要为字段支持 wildchar 相等性,因此我在 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);
    }
}

编辑:

正如一些评论中指出的那样,应该有一个单独的方法来检查 wildchar 是否相等。这种方法的局限性是我无法获得像 set.contains 这样的方法的正确结果,因为它们在内部检查 object.equals。所以我的 set.contains 将返回 false,即使我的对象通过了我单独的 wildchar 相等性方法的相等性测试。

最佳答案

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

关于java - hashCode 方法以防 equals 方法支持 wildchar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52586122/

相关文章:

java - 为什么Hashmap需要覆盖key的hashcode和equals方法?

java - 是否可以在 Tomcat 中终止 session 或强制 session 过期,无论是 Activity 的还是非 Activity 的?

java - 为什么Entry接口(interface)定义了equals和hashCode之类的方法?

c# - 为什么将两个字符串作为对象进行比较会导致意外结果

C# DotNetZip 错误 : The final hash has not been computed. 在 Ionic.Zip.WinZipAesCipherStream.get_FinalAuthentication()

java - 为什么 new Integer(i).hashCode() 会返回 i?

java - 任务在android studio中不成功

java - 为什么在用int添加字符串的同时还要添加空字符串?

java - 如何在Excel 2007中计算形状的位置?

java - 如何通过字段比较两个对象?