Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Java: hashmap, collision

Всегда ли доступ в HashMap имеет сложность O(1)?

Вопрос проверяет понимание худших сценариев работы хеш-таблиц и механизмов защиты от деградации производительности.

Короткий ответ

Нет, доступ в HashMap не всегда имеет сложность O(1).
При большом количестве коллизий поиск может стать линейным.
Начиная с Java 8, в худшем случае используется красно-чёрное дерево.
Это ограничивает сложность до O(log n).
Таким образом, HashMap защищена от сильной деградации.

Длинный ответ

Хотя HashMap оптимизирована под быстрый доступ, существуют неблагоприятные сценарии, влияющие на асимптотику.

Причина деградации

Основная причина — коллизии:

  • разные ключи дают одинаковый hashCode()

  • элементы попадают в один бакет

Если бакет представлен списком:

  • поиск требует перебора элементов

  • сложность становится O(n)

Защита в Java 8+

Начиная с Java 8, применяется оптимизация:

  • при большом числе элементов бакет превращается в дерево

  • используется красно-чёрное дерево

Результат:

  • поиск становится O(log n)

  • стабильная производительность даже при атаках на хеши

Важный нюанс

Дерево используется только если:

  • ключи реализуют Comparable

  • размер бакета превышает порог

Вывод

HashMap не гарантирует O(1) всегда, но современные реализации эффективно ограничивают худший случай.

Уровень

  • Рейтинг:

    5

  • Сложность:

    6

Навыки

  • Java

    Java

Ключевые слова

#hashmap

#collision

Подпишись на Java Developer в телеграм