← Назад ко всем вопросам

Что происходит в HashMap при добавлении новой пары ключ-значение, если ни один из ключей не совпадает с новым ключом по equals

1️⃣ Как кратко ответить

При добавлении новой пары ключ-значение в HashMap, если ни один из существующих ключей не совпадает с новым ключом по equals, HashMap вычисляет хэш-код нового ключа, определяет индекс в массиве бакетов и добавляет новую пару в соответствующий бакет. Если бакет пуст, создается новая запись. Если бакет уже содержит элементы, новая запись добавляется в начало или конец связанного списка (или дерева, если используется TreeNode).

2️⃣ Подробное объяснение темы

HashMap — это структура данных, которая позволяет хранить пары ключ-значение и обеспечивает быстрый доступ к значениям по ключу. Когда вы добавляете новую пару ключ-значение в HashMap, происходит несколько шагов:

  1. Вычисление хэш-кода ключа:

    • HashMap использует метод hashCode() ключа для вычисления хэш-кода. Этот хэш-код помогает определить, в какой бакет (ячейку массива) будет помещена пара ключ-значение.
  2. Определение индекса бакета:

    • Хэш-код преобразуется в индекс массива бакетов с помощью операции побитового И (&) с размером массива минус один. Это позволяет равномерно распределять элементы по массиву.
  3. Проверка бакета:

    • HashMap проверяет бакет по вычисленному индексу. Если бакет пуст (т.е. в нем нет ни одной записи), новая пара ключ-значение добавляется как первая запись в этом бакете.
  4. Добавление в непустой бакет:

    • Если бакет уже содержит элементы, HashMap проверяет каждую запись в бакете на совпадение ключей с помощью метода equals(). Если ни один из ключей не совпадает с новым ключом, новая запись добавляется в конец связанного списка (или в дерево, если количество элементов в бакете превышает определенный порог и они могут быть преобразованы в TreeNode для улучшения производительности).
  5. Обновление структуры данных:

    • Если количество элементов в HashMap превышает определенный порог (обычно 75% от текущего размера массива), происходит увеличение размера массива и перераспределение всех существующих записей (rehashing).

Пример кода:

import java.util.HashMap;
​
public class HashMapExample {
    public static void main(String[] args) {
        // Создаем новый HashMap
        HashMap<String, Integer> map = new HashMap<>();
​
        // Добавляем новую пару ключ-значение
        map.put("apple", 1);
        // 1. Вычисляется хэш-код для ключа "apple".
        // 2. Определяется индекс бакета на основе хэш-кода.
        // 3. Проверяется бакет по этому индексу.
        // 4. Так как бакет пуст, пара "apple"=1 добавляется в него.
​
        // Добавляем еще одну пару ключ-значение
        map.put("banana", 2);
        // 1. Вычисляется хэш-код для ключа "banana".
        // 2. Определяется индекс бакета.
        // 3. Проверяется бакет по этому индексу.
        // 4. Если бакет не пуст, проверяются существующие ключи на совпадение.
        // 5. Так как ключи не совпадают, пара "banana"=2 добавляется в бакет.
    }
}

В этом примере мы видим, как HashMap обрабатывает добавление новых пар ключ-значение. Если ключи не совпадают, новая пара просто добавляется в соответствующий бакет. Это позволяет HashMap эффективно управлять данными и обеспечивать быстрый доступ к значениям.

Тема: Java Core
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки