В настоящее время у меня есть переопределенный 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(). Я знаю, что мне нужно, чтобы hashCode() возвращал одно и то же значение для двух объектов, если они считаются равными методом equals(Object). Моя интуиция подсказывает мне, что есть какой-то случай, когда этот hashCode() нарушит контракт.
Есть ли приемлемый способ использования метода equalsIgnoreCase(String) в переопределенном методе equals(Object) и генерации хэш-кода, не нарушающего контракт?
Locale
по умолчанию, но всегда должны использоватьString.toLowerCase(Locale)
с явнымLocale
. В противном случае вы столкнетесь с печально известной ошибкой турецкой локали. - person Robert Tupelo-Schneck   schedule 08.05.2013