我可以在班级使用班级成员的哈希码吗? [英] Can I use hashcode of class member for class?

查看:67
本文介绍了我可以在班级使用班级成员的哈希码吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个以最终String作为唯一ID的类.当然,我想覆盖等于,因此比较仅基于ID.那么仅返回ID的哈希码是正确的做法,如下所示?

I have class with final String as unique ID. Of course I want to override equals so comparison is based on ID only. Is it correct practice then to just return hash code of ID, like below?

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

推荐答案

如果您的等值不区分大小写,则不会.您可能会有两个 ItemSpec 相等但具有不同的哈希码.这打破了对哈希码最关键的要求.

Not if your equals is case insensitive. You could have two ItemSpec coming out as equal but with different hash codes. That breaks the most crucial requirement of a hash code.

您的等于必须与您的 hashCode 一致.因此,如果要不区分大小写地比较它们,则必须不区分大小写地编写 hashCode 大小写.

Your equals has to agree with your hashCode. So if you are going to compare them case insensitively, you have to write your hashCode case insensitively.

@Override
public int hashCode(){
     if (name == null){
         return 0;
     } else{
         return name.toLowerCase().hashCode();
     }
}

您的 hashCode 方法还暗示 name 可以为null.如果是这样,您也应该在 equals 方法中对它进行空检查.

Also your hashCode method implies that name could be null. If so, you should null-check it in your equals method as well.

这篇关于我可以在班级使用班级成员的哈希码吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆