考虑我有一个拥有String类成员的POJO:
class POJO {
String name, address, emailId;
equals() {
}
hashCode() {
// How?
}
}
如何将hashCode
的字符串组合成POJO的hashCode
?
答案 0 :(得分:23)
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;
}
答案 1 :(得分:8)
您可以使用org.apache.commons.lang.builder.HashCodeBuilder类而无需担心哈希码实现。它遵循哈希码和等于之间的契约。
对于您的课程,您必须执行以下操作。
@Override
public int hashCode(){
HashCodeBuilder builder = new HashCodeBuilder();
builder.append(name);
builder.append(address);
builder.append(emailId);
return builder.toHashCode();
}
答案 2 :(得分: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;
}
答案 3 :(得分:1)
下面是一个相当不错的哈希码。
@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;
}