NoM*_*ded 1 java hashcode class-members
我有一个带有最终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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
khe*_*ood 12
如果您的等号不区分大小写,则不会.你可以有两个ItemSpec相同的但具有不同的哈希码.这打破了哈希码的最关键要求.
你equals必须同意你的意见hashCode.因此,如果您要对它们进行不敏感的比较,则必须不敏感地编写hashCode案例.
@Override
public int hashCode(){
if (name == null){
return 0;
} else{
return name.toLowerCase().hashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
此外,您的hashCode方法暗示name可能为null.如果是这样,您也应该在equals方法中对其进行空值检查.