我在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());
}
}
在上面的代码中,我在生成哈希码时做小写。这是好的做法吗?
谢谢!
答案 0 :(得分:4)
这不是关于好的或坏的做法。这是关于你自己的需求和与你的对象相关的平等感。
在这种情况下,如果equals
方法应该返回true
忽略大小写,则会相应地实施hashCode
方法。这是正确的,因为实现equals
和hashCode
的规则之一一起声明如果两个对象在语义上相等(即,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()
。然后您的代码将更容易维护,因为它将更加标准。