Ответ
Hashtable — устаревший синхронизированный класс (с Java 1.0). HashMap — несинхронизированная, современная реализация (с Java 1.2).
Основные различия:
-
Потокобезопасность (Thread-Safety):
Hashtable: Все методы синхронизированы (synchronized). Потокобезопасен, но с низкой производительностью из-за глобальной блокировки.HashMap: Методы не синхронизированы. Не потокобезопасен, но быстрее. Для многопоточного доступа используйтеConcurrentHashMapили внешнюю синхронизацию.
-
Допустимость null:
Hashtable: Не позволяет использоватьnullни в качестве ключа, ни в качестве значения. ВыбрасываетNullPointerException.HashMap: Позволяет одинnull-ключ и множествоnull-значений.
-
Наследование и итерация:
Hashtableнаследует от устаревшего классаDictionaryи использует перечисление (Enumeration) для итерации.HashMapнаследует отAbstractMapи является частью современной Collections Framework. ИспользуетIterator.
Пример, показывающий разницу с null:
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put(null, "value"); // OK
hashMap.put("key", null); // OK
Hashtable<String, String> hashtable = new Hashtable<>();
hashtable.put(null, "value"); // Выбросит NullPointerException
hashtable.put("key", null); // Выбросит NullPointerException
Рекомендация: Hashtable считается легаси-кодом. В современной разработке всегда используйте HashMap. Для потокобезопасных сценариев используйте ConcurrentHashMap.