【问题标题】:How calculate hashCode of a Pojo by combining hashCodes of it's keys [duplicate]如何通过组合键的 hashCodes 计算 Pojo 的 hashCode [重复]
【发布时间】:2013-08-05 07:19:56
【问题描述】:

假设我有一个 POJO 具有 String 类成员:

class POJO {
  String name, address, emailId;
  equals() {

  }
  hashCode() {
    // How?    
  }
}

如何将我的字符串中的hashCodes 组合成一个用于 POJO 的hashCode

【问题讨论】:

  • return 31 + 7 * name.hashCode() + 11 * address.hashCode()//...etc
  • 日食:Source --> Generate hashCode() and equals() ...
  • Netbeans:Alt + Insert --> Generate hashCode() and equals()
  • 极有可能与stackoverflow.com/q/2730865/544983重复
  • 你真的不需要担心这些,因为 IDE 可以为你生成它

标签: java hashcode pojo


【解决方案1】:

Java 7 有一个实用方法来创建适合大多数用途的哈希码:

return Objects.hash(name, address, emailId);

你仍然需要确保你的 equals 方法是一致的。这两种方法可能如下所示:

@Override
public int hashCode() {
    return Objects.hash(name, address, emailId);
}

@Override
public boolean equals(Object obj) {
    if (obj == null) return false;
    if (getClass() != obj.getClass()) return false;
    final POJO other = (POJO) obj;
    if (!Objects.equals(this.name, other.name)) return false;
    if (!Objects.equals(this.address, other.address)) return false;
    if (!Objects.equals(this.emailId, other.emailId)) return false;
    return true;
}

【讨论】:

    【解决方案2】:

    您可以使用org.apache.commons.lang.builder.HashCodeBuilder 类而无需担心哈希码的实现。它遵循hashcodeequals 之间的约定。
    对于您的课程,您必须执行如下实现。

    @Override    
    public int hashCode(){
        HashCodeBuilder builder = new HashCodeBuilder();
        builder.append(name);
        builder.append(address);
        builder.append(emailId);
        return builder.toHashCode();
    }
    

    【讨论】:

      【解决方案3】:

      这是一个相当不错的哈希码。

         @Override
          public int hashCode() {
              int hash = 7;
              hash = 29 * hash + Objects.hashCode(this.name);
              hash = 29 * hash + Objects.hashCode(this.address);
              hash = 29 * hash + Objects.hashCode(this.emailId);
              return hash;
          }
      

      【讨论】:

        【解决方案4】:

        这样做:

        public int hashCode()
        {
                    final int prime = 31;
                    int result = 1;
                    result = prime * result
                            + ((address == null) ? 0 : address.hashCode());
                    result = prime * result
                            + ((emailId == null) ? 0 : emailId.hashCode());
                    result = prime * result + ((name == null) ? 0 : name.hashCode());
                    return result;
        }
        

        【讨论】:

        • 您在prime * result 上反复添加什么?我认为这不会为hashCode 添加任何内容。
        • @BoristheSpider:只是为了让哈希码独一无二。
        • 是的,你应该使用一个素数,但是将每个相乘而不是添加到hashCode,而不是用素数重复缩放hashCode。所以result += 7 * address。如果两个字段的值交换了,那么每个字段也使用不同的素数,那么 hashCode 更有可能是唯一的。
        • 通常人们使用带等号的哈希码。
        猜你喜欢
        • 1970-01-01
        • 2015-12-13
        • 1970-01-01
        • 2020-09-08
        • 2012-11-14
        • 1970-01-01
        • 2021-12-19
        • 2012-12-17
        • 1970-01-01
        相关资源
        最近更新 更多