Ответ
В HashMap методы hashCode() и equals() работают в паре для определения уникальности ключа и разрешения коллизий.
Алгоритм добавления элемента map.put(key, value):
- Вычисляется хеш-код ключа (
key.hashCode()). - На основе хеш-кода определяется индекс бакета (корзины) в массиве.
- Если бакет пуст — элемент добавляется в него.
- Если бакет не пуст (коллизия), для каждого ключа в этом бакете (в связном списке или дереве) вызывается метод
equals()для сравнения с новым ключом.- Если
equals()вернулtrueдля какого-либо существующего ключа, это считается дубликатом. Значение для этого ключа перезаписывается новым значением. - Если
equals()вернулfalseдля всех ключей в бакете, новый элемент добавляется в список/дерево этого бакета.
- Если
Пример:
Map<String, Integer> map = new HashMap<>();
map.put("apple", 1); // hashCode("apple") -> бакет 5, добавляем
map.put("banana", 2); // hashCode("banana") -> бакет 3, добавляем
map.put("apple", 3); // hashCode("apple") -> бакет 5, equals("apple", "apple") -> true, ЗНАЧЕНИЕ ПЕРЕЗАПИСЫВАЕТСЯ на 3
Критически важное правило: Если два объекта равны по equals(), их hashCode() обязаны возвращать одинаковое значение. Нарушение этого контракта приведет к некорректной работе HashMap — «равные» ключи попадут в разные бакеты и будут считаться разными.