11

考虑我有一个 POJO 具有 String 类成员:

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

  }
  hashCode() {
    // How?    
  }
}

我如何将hashCode我的字符串组合成一个hashCodefor POJO?

4

4 回答 4

31

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;
}
于 2013-08-05T07:28:05.443 回答
9

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

@Override    
public int hashCode(){
    HashCodeBuilder builder = new HashCodeBuilder();
    builder.append(name);
    builder.append(address);
    builder.append(emailId);
    return builder.toHashCode();
}
于 2013-08-05T07:37:20.000 回答
2

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

   @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;
    }
于 2013-08-05T07:28:18.350 回答
1

像这样做:

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;
}
于 2013-08-05T07:21:49.747 回答