我有一个带有最终String的类作为唯一ID。当然我想重写equals所以比较只基于ID。那么只返回ID的哈希码是正确的做法,如下所示吗?
class ItemSpec{
final String name;
...
@Override
public boolean equals(Object o){
if(o != null && o instanceof ItemSpec){
return name.equalsIgnoreCase(((ItemSpec)o).name);
} else{
return false;
}
}
@Override
public int hashCode(){
if(name == null){
return 0;
} else{
return name.hashCode();
}
}
}
答案 0 :(得分:12)
如果您的equals不区分大小写,则不会。你可以有两个ItemSpec
相同但具有不同的哈希码。这打破了哈希码的最关键要求。
您的equals
必须同意您的hashCode
。因此,如果您要对它们进行不敏感的比较,则必须不敏感地编写hashCode
个案例。
@Override
public int hashCode(){
if (name == null){
return 0;
} else{
return name.toLowerCase().hashCode();
}
}
此外,您的hashCode
方法意味着name
可能为空。如果是这样,您也应该在equals
方法中对其进行无效检查。
答案 1 :(得分:-1)
我认为你的做法没有任何问题。
但是,我经常看到以下实现:
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
更新: 这是一个更好解释的链接: Best implementation for hashCode method