Почему класс HashTable считается устаревшим в Java?

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

Ответ

Hashtable — это устаревший synchronized класс из Java 1.0. Его не рекомендуется использовать в новом коде по нескольким причинам:

  1. Низкая производительность в однопоточных сценариях: Все его методы синхронизированы (synchronized), что создает ненужные накладные расходы, если конкурентный доступ не требуется.

  2. Запрет null: Hashtable не позволяет использовать null ни в качестве ключа, ни в качестве значения, что менее гибко по сравнению с современными аналогами.

    Hashtable<String, String> table = new Hashtable<>();
    table.put("key", null); // Выбросит NullPointerException
  3. Устаревший дизайн: Он был практически вытеснен более совершенными классами из Java Collections Framework (JCF).

Современные альтернативы:

  • HashMap — для однопоточного доступа (выше скорость, разрешены null).
  • ConcurrentHashMap — для многопоточного доступа (гораздо более эффективная сегментированная блокировка вместо полной синхронизации).

    // Правильные альтернативы
    Map<String, Integer> map = new HashMap<>();
    map.put("key", null); // OK
    
    Map<String, Integer> concurrentMap = new ConcurrentHashMap<>();
    // Высокая производительность при конкурентном доступе