有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

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