【发布时间】:2013-03-15 18:15:24
【问题描述】:
我目前有一个被覆盖的equals(Object),看起来像这样:
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (! (o instanceof Player)) return false;
Player p = (Player) o;
return getFirstName().equalsIgnoreCase(p.getFirstName()) &&
getLastName().equalsIgnoreCase(p.getLastName());
}
我的hashCode() 目前看起来像这样:
@Override
public int hashCode() {
int result = 17;
result = 31 * result + getFirstName().toLowerCase().hashCode();
result = 31 * result + getLastName().toLowerCase().hashCode();
return result;
}
我的问题是关于我重写的 hashCode() 方法。我知道如果 equals(Object) 方法认为它们相等,我需要 hashCode() 为两个对象返回相同的值。我的直觉告诉我有 some 这种 hashCode() 会违反合同的情况。
是否有一种可接受的方式在被覆盖的 equals(Object) 方法中使用 equalsIgnoreCase(String) 方法并生成不违反合同的哈希码?
【问题讨论】:
-
In hashCode() result = 31... 应该是 result *= 31... 这样你就不会丢失已经存在的值。
-
他在等式中有结果,31 * 结果+(其他)。所以不会丢失。只是我的 2 美分,但我认为你的做法是正确的。你的 equals 方法对我来说看起来不错。
-
为什么你的代码会违反合约?你的直觉一定很紧张,不要听它;)
-
我可能只是有点过于谨慎,但我不完全确定 equalsIgnoreCase() 和 toLowerCase() 方法如何处理特殊字符和不同的语言环境。我认为这不适用于此应用程序,但我正在尝试做一些尽可能防弹的事情来养成这种习惯。
-
传统的智慧是你永远不应该依赖默认的
Locale,而应该始终使用String.toLowerCase(Locale)和明确的Locale。否则你会遇到“臭名昭著的土耳其语言环境错误”。
标签: java overriding equals hashcode