Почему Hashtable считается устаревшим (legacy) в современных Java-приложениях?

«Почему Hashtable считается устаревшим (legacy) в современных Java-приложениях?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Hashtable — это синхронизированный класс из Java 1.0, который не является deprecated, но считается legacy-кодом. Для новых проектов он не рекомендуется из-за существенных недостатков по сравнению с современными альтернативами.

Ключевые проблемы Hashtable:

Недостаток Следствие Современная альтернатива
Грубая синхронизация на уровне методов (synchronized для каждого метода) Высокие накладные расходы на блокировки, даже при использовании в однопоточном контексте. Низкая производительность. HashMap + внешняя синхронизация (Collections.synchronizedMap()) при необходимости.
Не поддерживает null в качестве ключа или значения Ограничивает применение, требует дополнительных проверок. HashMap и ConcurrentHashMap разрешают null значения (только HashMap разрешает null ключ).
Наследует устаревший класс Dictionary Не соответствует современной иерархии коллекций (Map интерфейс). Все современные реализации (HashMap, ConcurrentHashMap) реализуют интерфейс Map.

Примеры замены:

// 1. Однопоточный сценарий (самый частый) — используйте HashMap
Map<String, Integer> modernMap = new HashMap<>();
modernMap.put("key", null); // Разрешено

// 2. Если нужна синхронизация как у Hashtable
Map<String, Integer> syncMap = Collections.synchronizedMap(new HashMap<>());

// 3. Для высококонкурентных сценариев — используйте ConcurrentHashMap
ConcurrentHashMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();
// Высокая производительность за счёт сегментированных блокировок.

Вывод: Используйте HashMap по умолчанию, ConcurrentHashMap для многопоточности. Hashtable остаётся только для поддержки старого кода.