В чем разница между Hashtable и HashMap в Java?

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

Ответ

Hashtable — устаревший синхронизированный класс (с Java 1.0). HashMap — несинхронизированная, современная реализация (с Java 1.2).

Основные различия:

  1. Потокобезопасность (Thread-Safety):

    • Hashtable: Все методы синхронизированы (synchronized). Потокобезопасен, но с низкой производительностью из-за глобальной блокировки.
    • HashMap: Методы не синхронизированы. Не потокобезопасен, но быстрее. Для многопоточного доступа используйте ConcurrentHashMap или внешнюю синхронизацию.
  2. Допустимость null:

    • Hashtable: Не позволяет использовать null ни в качестве ключа, ни в качестве значения. Выбрасывает NullPointerException.
    • HashMap: Позволяет один null-ключ и множество null-значений.
  3. Наследование и итерация:

    • 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.