我可以在课堂上使用班级成员的哈希码吗?

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方法中对其进行空值检查.

  • 难道不存在`a.equalsIgnoreCase(b)`但是`a.toLowerCase().equals(b.toLowerCase())`是假的情况? (2认同)