Вы должны всегда читать документацию по основному контракту между входом метода и методой выводом. В этом случае документация состояния (опуская ненужные пункты):
Он не требуется, если два объекта равны в соответствии с {@link java.lang.Object # равна (java.lang.Object)} , а затем вызов метода {@code hashCode} на каждом из двух объектов должен производить различные целые результаты. Тем не менее, программист должен знать, что получение отдельных целых результатов для неравных объектов может улучшить производительность хеш-таблиц.
Что касается того, почему значения одинаковы, хорошая вещь о Java - вы всегда можете взглянуть на источник. Так вычисляется hashCode
для примера String
.
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
Теперь ваши значения строковых пример:
"Aa" = 31 * (31 * 0 + 65) + 97 = 2112
"BB" = 31 * (31 * 0 + 66) + 66 = 2112
Примечание: числовое значение для 'A' = 65, 'B' = 66, 'a' = 97
.
Существует 2^32 возможных уникальных хеш-кода. Есть еще много возможных строк. Следовательно, разные строки могут иметь один и тот же хэш-код. – Eran
Это то, что они называют «хэш-столкновениями», и это одна из причин, почему у Hash *** есть ведра или какая-то суперсложная логика переключения. Либо для хеш-значений-коллизий, либо хеш-значение-модуло-столкновений. – JayC667