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

时间:2014-09-19 15:03:06

标签: 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();
         }
    }
}

2 个答案:

答案 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