代码之家  ›  专栏  ›  技术社区  ›  tryingToLearn

case equals方法中的hashCode方法支持wildchar

  •  1
  • tryingToLearn  · 技术社区  · 6 年前

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

    equals 方法。现在,如何基于这个参数构建hashcode方法?i、 e.如果我按照下面的代码进行计算,那么对于通过equals方法的相等性检查的两个对象,我将得到不同的hashcode。

    例如,考虑以下类别:

    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 内部。所以我的 集合.contains 将返回false,即使我的对象通过了单独的wildchar相等方法的相等测试。

    1 回复  |  直到 6 年前
        1
  •  4
  •   davidxxx    6 年前

    使用相同的逻辑 hashCode() 是不可能的 我们不根据比较对象来计算哈希代码,而是根据当前对象状态来计算 .
    哈希码()
    你最初的问题来自于这样一个事实,即你想赋予一个不是设计成要进入社会的责任 equals() 方法:定义超出对象实际状态(即实际字段值)的相等性。
    所以你不应该使用 方法来执行通配符比较,而不是为其编写专用方法。