Получить доступ

Чем HashMap отличается от Hashtable и ConcurrentHashMap?

MiddleКоллекции
Ещё спрашивают так:
  • Можно ли использовать HashMap из нескольких потоков?
Коротко

HashMap — не потокобезопасна, допускает один null-ключ и null-значения. Hashtable — устаревшая, все методы synchronized, null запрещён. ConcurrentHashMap — потокобезопасная с мелкой блокировкой, null запрещён.

  • Однопоточно или под внешней синхронизацией — HashMap
  • Конкурентный доступ — ConcurrentHashMap
  • Hashtable в новом коде не нужна

А ещё Параллельная запись в HashMap может потерять данные и испортить структуру

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Попробуйте сами

HashMap: put, коллизия и resize

Подробно

HashMapHashtableConcurrentHashMap
потокобезопасностьнетда, один замокда, замок на корзину и CAS
null-ключ / значенияодин ключ, значения данетнет
итераторfail-fastfail-fast (Enumeration — нет)weakly consistent
появиласьJava 1.2Java 1.0Java 5

HashMap из нескольких потоков: одновременные put теряют записи, а при расширении таблицы данные могут оказаться в неверных корзинах (до Java 8 — даже бесконечный цикл в цепочке). Безопасно только чтение карты, которая больше не меняется и была безопасно опубликована.

Hashtable — класс из Java 1.0: synchronized на каждом методе, итерация через Enumeration, null запрещены. Медленнее ConcurrentHashMap под конкуренцией и не даёт атомарных составных операций.

ConcurrentHashMap — выбор для общего кэша, счётчиков (merge(key, 1, Integer::sum)), реестров. Итератор не бросает ConcurrentModificationException и может видеть часть параллельных изменений.

Что хотят услышать

  • Различия в потокобезопасности и null.
  • Что произойдёт при конкурентной записи в HashMap.
  • Практический выбор.

Частые ошибки

  • Считать Hashtable лучшим выбором для многопоточности.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Все три потокобезопасны одинаково
  • ✗HashMap синхронизирован, Hashtable — нет
  • ✗ConcurrentHashMap медленнее Hashtable
  • ✓HashMap не синхронизирован (1 поток); Hashtable — легаси с глобальным замком; ConcurrentHashMap — потокобезопасен с блокировкой по бакетам

Что спросят дальше

  • Что такое fail-fast iterator?
  • Почему ConcurrentHashMap запрещает null?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем