如何通过组合它的键的hashCodes来计算Pojo的hashCode

Vis*_*ire 9 java hashcode pojo

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

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

  }
  hashCode() {
    // How?    
  }
}
Run Code Online (Sandbox Code Playgroud)

如何将hashCode我的弦乐组合成一个hashCodePOJO?

ass*_*ias 24

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

return Objects.hash(name, address, emailId);
Run Code Online (Sandbox Code Playgroud)

您仍然需要确保您的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;
}
Run Code Online (Sandbox Code Playgroud)


Pra*_*ker 8

您可以使用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();
}
Run Code Online (Sandbox Code Playgroud)


Ank*_*thi 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,您应该使用素数,但是将每个不加法与“hashCode”相乘,而不是用素数重复缩放“hashCode”。所以‘结果 += 7 * 地址’。还可以为每个字段使用不同的素数,这样如果两个字段的值交换,则 hashCode 更有可能是唯一的。 (2认同)