Что эффективнее в Java: Hashtable или ConcurrentHashMap?

«Что эффективнее в Java: Hashtable или ConcurrentHashMap?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

ConcurrentHashMap значительно эффективнее Hashtable в многопоточных сценариях.

Сравнение механизмов синхронизации:

Критерий Hashtable ConcurrentHashMap
Уровень блокировки Блокирует весь объект (монитор) на время любой операции (put, get). Использует сегментированные блокировки (до Java 8) или операции CAS на отдельных узлах (Java 8+).
Параллелизм Нулевой — только один поток может работать с таблицей одновременно. Высокий — множество потоков могут читать и модифицировать разные сегменты/узлы одновременно.
Производительность Низкая из-за глобальной блокировки. Высокая, особенно при большом количестве потоков и операций записи.
Null-значения Не разрешает null ни для ключей, ни для значений. Также не разрешает null.
Статус Устаревший (legacy) класс. Современная, рекомендуемая реализация.

Пример использования ConcurrentHashMap:

import java.util.concurrent.ConcurrentHashMap;

ConcurrentHashMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();
// Потокобезопасные операции без блокировки всей таблицы
concurrentMap.put("key1", 100);
Integer value = concurrentMap.get("key1");

Вывод: Hashtable следует считать устаревшим. Для многопоточных ассоциативных массивов всегда выбирайте ConcurrentHashMap. Для однопоточного использования подойдет HashMap.