覆盖equals和hashcode忽略这种情况?

时间:2014-01-03 08:50:03

标签: java

我在pojo下面覆盖了equals和hashcode。

class Name {  
    private String name;  

    public Name(String name) {  
        this.name = name;  
    }  

    public String getName() {  
        return name;  
    }  

    public int hashCode() {  
        return name.toLowerCase().hashCode();  
    }  

    public boolean equals(Object obj) {  
        if (!(obj instanceof Name) return false;  
        return name.toLowerCase().equals(((Name) obj).name.toLowerCase());  
    }  
}  

在上面的代码中,我在生成哈希码时做小写。这是好的做法吗?

谢谢!

5 个答案:

答案 0 :(得分:4)

这不是关于好的或坏的做法。这是关于你自己的需求和与你的对象相关的平等感。

在这种情况下,如果equals方法应该返回true忽略大小写,则会相应地实施hashCode方法。这是正确的,因为实现equalshashCode的规则之一一起声明如果两个对象在语义上相等(即,equals方法对两个对象返回true),那么哈希码应该相等

答案 1 :(得分:0)

为了满足必要性,实际完成了等于和哈希码的覆盖。如果你的要求是显示两个字符串等于即使它们有不同的情况(上面或下面),那么我认为使用它没有坏处

答案 2 :(得分:0)

引入另一个字段

是有意义的
String lowerCaseName;

然后hashCode会更有效率

return lowerCaseName.hashCode()

同样在equals我出于同样的原因使用String.equalsIgnoreCase

return name.equalsIgnoreCase((((Name) obj).name);  

答案 3 :(得分:0)

如果您只想比较字符串对象而忽略大小写,则以下代码将执行

String hello_caps = "HELLO";
String hello = "hello";
hello.equalsIgnoreCase(hello_caps);

答案 4 :(得分:0)

五个评论点:

1)为什么在你所做的所有事情都在实现一个带有小写比较和散列的字符串时调用类Name?这个类对其他东西很有用,所以称之为更通用的东西。

2)每次计算哈希时,您都会获取字符串的深层副本以实现小写转换。哈希函数应该很快。至少缓存小写等价物。

3)仔细考虑hashCode()toString()之间的关系。

4)在适当的地方添加@Override注释。

5)name可能是null。在这种情况下,hashCode()将抛出空指针异常。

虽然想法没有任何问题,但就个人而言,我只是使用标准字符串并使用equalsIgnoreCase()。然后您的代码将更容易维护,因为它将更加标准。