Ответ
Основные операции put(), get() и remove() в HashMap имеют амортизированную сложность O(1), но могут деградировать в худших сценариях.
Факторы, влияющие на производительность:
-
Коллизии хешей
- При совпадении хеш-кодов разные ключи помещаются в один бакет (bucket).
- В Java 8+ бакет из связного списка преобразуется в красно-чёрное дерево, если коллизий много.
- Худший случай:
O(n)для списка илиO(log n)для дерева в одном бакете.
-
Качество реализации
hashCode()иequals()- Плохая хеш-функция, возвращающая константу, сводит все ключи в один бакет.
- Пример плохого
hashCode:@Override public int hashCode() { return 1; // Катастрофически много коллизий! }
-
Ресайзинг (увеличение вместимости)
- При достижении порога (
load factor, по умолчанию 0.75) внутренний массив бакетов увеличивается вдвое. - Происходит перехеширование всех элементов — операция стоимостью
O(n).
- При достижении порога (
Практический вывод: Для сохранения сложности ~O(1) ключи должны иметь эффективные и равномерно распределяющие hashCode() и equals() методы.