Как HashMap в Java использует хеш-код ключа?

«Как HashMap в Java использует хеш-код ключа?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

HashMap не возвращает хеш-код. Хеш-код ключа (key.hashCode()) используется внутренне для быстрого определения «корзины» (bucket), в которой может храниться пара ключ-значение. При поиске по key возвращается значение (value), связанное с этим ключом, или null.

Алгоритм работы get(key):

  1. Вычисляется хеш-код ключа: int hash = key.hashCode().
  2. Хеш преобразуется во внутренний индекс корзины (с учетом емкости массива корзин).
  3. В найденной корзине происходит поиск ключа, используя сначала ==, а затем equals().
  4. Возвращается value, связанное с найденным ключом.

Пример:

import java.util.HashMap;

public class HashMapExample {
    public static void main(String[] args) {
        HashMap<String, Integer> priceMap = new HashMap<>();
        priceMap.put("apple", 100);
        priceMap.put("banana", 50);

        // HashMap возвращает ЗНАЧЕНИЕ, а не хеш-код
        Integer applePrice = priceMap.get("apple");
        System.out.println(applePrice); // 100

        // Хеш-код строки "apple" используется внутри, но не возвращается
        System.out.println("apple".hashCode()); // 93029210 (это не имеет отношения к get)
    }
}

Важные детали:

  • Коллизии: Если разные ключи попадают в одну корзину (по хеш-коду или после преобразования в индекс), они хранятся в виде связанного списка или дерева (в Java 8+).
  • Контракт hashCode() и equals(): Для корректной работы HashMap обязательно, чтобы:
    • Если a.equals(b) == true, то a.hashCode() == b.hashCode().
    • Обратное (одинаковые хеш-коды у неравных объектов) допустимо, но ведет к коллизиям и снижению производительности.