← Назад к вопросам

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

1.0 Junior🔥 121 комментариев
#Коллекции и структуры данных

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Основные различия между HashMap и Hashtable

Основное различие между HashMap и Hashtable заключается в том, что HashMap не синхронизирована (не потокобезопасна), тогда как Hashtable синхронизирована (потокобезопасна). Это фундаментальное различие порождает большинство остальных различий между этими двумя структурами данных.

Ключевые отличия:

1. Синхронизация и потокобезопасность

  • Hashtable синхронизирована на уровне методов - все операции защищены, что делает её потокобезопасной, но снижает производительность в однопоточных сценариях
  • HashMap не синхронизирована, что делает её быстрее, но требует внешней синхронизации при использовании в многопоточных средах

2. Производительность

  • HashMap обычно работает быстрее, так как не несет накладных расходов на синхронизацию
  • Hashtable медленнее из-за блокировок на уровне методов

3. Обработка null-значений

  • HashMap позволяет иметь один null-ключ и множество null-значений
  • Hashtable не позволяет ни null-ключи, ни null-значения - попытка добавить null вызывает NullPointerException

4. Наследование и итераторы

  • HashMap использует Iterator для обхода элементов, который является fail-fast (быстро падающим при конкурентной модификации)
  • Hashtable использует Enumerator для обхода, который не является fail-fast

5. Версии Java и наследование

  • Hashtable - устаревший класс, присутствует с Java 1.0
  • HashMap - часть Java Collections Framework с версии Java 1.2, наследуется от AbstractMap

Примеры кода:

Пример с HashMap (допускает null):

// Создание HashMap
Map<String, Integer> hashMap = new HashMap<>();

// Добавление элементов
hashMap.put("Яблоко", 10);
hashMap.put("Банан", 20);
hashMap.put(null, 30); // Допустимо
hashMap.put("Апельсин", null); // Допустимо

// Итерация с использованием Iterator
Iterator<Map.Entry<String, Integer>> iterator = hashMap.entrySet().iterator();
while (iterator.hasNext()) {
    Map.Entry<String, Integer> entry = iterator.next();
    System.out.println(entry.getKey() + ": " + entry.getValue());
}

Пример с Hashtable (не допускает null):

// Создание Hashtable
Hashtable<String, Integer> hashtable = new Hashtable<>();

// Добавление элементов
hashtable.put("Яблоко", 10);
hashtable.put("Банан", 20);
// hashtable.put(null, 30); // Вызовет NullPointerException
// hashtable.put("Апельсин", null); // Вызовет NullPointerException

// Итерация с использованием Enumeration
Enumeration<String> keys = hashtable.keys();
while (keys.hasMoreElements()) {
    String key = keys.nextElement();
    System.out.println(key + ": " + hashtable.get(key));
}

Когда что использовать:

Используйте HashMap, когда:

  • Работаете в однопоточном окружении
  • Нужна максимальная производительность
  • Требуется возможность хранения null-значений
  • Используете современный Java Collections Framework

Используйте Hashtable, когда:

  • Работаете в многопоточном окружении без внешней синхронизации
  • Наследуете старый код, написанный до Java 1.2
  • Требуется гарантированная потокобезопасность на уровне структуры данных

Важное замечание для многопоточных сред:

Для многопоточных приложений вместо Hashtable обычно рекомендуется использовать:

  • ConcurrentHashMap (из пакета java.util.concurrent) - обеспечивает лучшую производительность за счёт сегментированных блокировок
  • Collections.synchronizedMap() для обертывания HashMap, если нужна полная синхронизация
// Создание потокобезопасной версии HashMap
Map<String, Integer> synchronizedMap = Collections.synchronizedMap(new HashMap<>());

Заключение:

В современной разработке HashMap является предпочтительным выбором в большинстве случаев благодаря своей производительности, гибкости и интеграции с Java Collections Framework. Hashtable считается устаревшим классом, и его использование оправдано только при поддержке legacy-кода или в специфических многопоточных сценариях, где нельзя использовать более современные альтернативы типа ConcurrentHashMap.

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