我现在有一个覆盖equals(Object)
,看起来像这样:使用equalsIgnoreCase重写的equals重载的hashCode检查平等
@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()方法。我知道我需要hashCode()来返回两个对象的相同值,如果它们被equals(Object)方法视为相等的话。我的直觉告诉我有一些这种情况下,这个hashCode()将违反合同。
是否有一种可接受的方式在重写的equals(Object)方法中使用equalsIgnoreCase(String)方法并生成不违反合约的哈希码?
在hashCode()方法的结果= 31 ...应该是结果* = 31 ......这样你就不会在那里已经失去了价值。 – Patashu 2013-03-26 03:25:05
他导致方程,31 * result +(otherstuff)。所以它不会丢失。我的2美分,但我认为你是在正确的方式。你的equals方法对我来说看起来不错。 – Kyle 2013-03-26 03:27:19
为什么你的代码违反合同?你的直觉一定很紧张,不要听它;) – ddmps 2013-03-26 03:31:30