Ответ
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 остаётся только для поддержки старого кода.