Я новичок в Java и недавно узнал о hashCode()
. В статье в Википедии о Java hashCode () есть следующий пример hashCode()
метод:
public class Employee {
int employeeId;
String name;
Department dept;
// other methods would be in here
@Override
public int hashCode() {
int hash = 1;
hash = hash * 17 + employeeId;
hash = hash * 31 + name.hashCode();
hash = hash * 13 + (dept == null ? 0 : dept.hashCode());
return hash;
}
}
Я понимаю, что умножение на 31 и 13 снижает вероятность столкновения, но я не понимаю, почему hash
инициализируется значением 1, а не employeeId
. В конце концов, это просто приводит к добавлению 17 * 31 * 13 к hashCode()
, что не повлияет на то, равны ли два значения hashCode () или нет.
В статье Блоха «Эффективная Java (второе издание)» есть очень похожий пример в правиле 9 (страницы 47 и 48), но его объяснение этой аддитивной константы для меня довольно загадочно.
Изменить: этот вопрос был отмечен как дубликат вопроса Почему Java hashCode () в String использует 31 в качестве множителя? Это не тот вопрос: он спрашивает, есть ли причина предпочесть число 31 любому другому числу в формуле для hashCode()
из String
. У меня вопрос: почему во многих примерах hashCode()
, которые я нашел в Интернете, к hashCode()
всех объектов добавляется одна константа.
Фактически, здесь уместен пример hashCode()
из String
, потому что в этом примере не добавлена константа. Если добавление 17 * 31 * 13 имеет какой-либо эффект в приведенном выше примере, почему бы не добавить такую константу при вычислении hashCode()
из String
?
int hash = 17 + employeeId;
- person Scary Wombat   schedule 03.10.2018int hash = 17 * employeeId;
и затем продолжить, это просто делает код красивым и однородным, и компилятор все равно оптимизирует его, так что это чисто косметический характер. - person Mike 'Pomax' Kamermans   schedule 03.10.2018