В этой статье мы рассмотрим интересный вопрос из раздела Коллекции в Java, а именно «В чем разница между классами Hashtable и HashMap?».
Разница между Hashtable и HashMap в Java
В ходе работы с каждым из классов было обнаружено значительное отличие в производительности на достаточно больших объемах данных. Познакомившись подробнее с документацией и особенностями работы каждой коллекции, решил написать эту статью — небольшую выжимку полученной информации для возможности быстро освежить знания в будущем. Коллекция Hashtable хоть и «древняя», но до сих пор используется на старых проектах. К тому же, практика показывает, что этот вопрос часто задают на собеседованиях.
Кратко о HashMap
HashMap реализует интерфейс Map, который подразумевает хранение данных в виде пар ключ-значение. HashMap не является синхронизированным и потокобезопасным. Также HashMap допускает хранение null
ключей и значений, но недопускает дублей ключей. Следует помнить, что для null-ключа hashCode()
всегда равен нулю.
Маленький пример использования HashMap:
1 2 3 |
HashMap<Interger, String> studentsHashmap = new HashMap<Integer, String>(); studentsHashmap.put(1, null); // здесь все хорошо, studentsHashmap.put(null, "Andrii"); // и здесь тоже все без проблем |
Кратко о Hashtable
Hashtable реализует интерфейс Map, которая хранит пары ключ-значения. Hashtable является синхронизированной и потокобезопасной коллекцией. Hashtable не допускается null-ключей и дублирующих ключей, а также null-значений.
Пример использования HashMap:
1 2 3 |
Hashtable<Interger, String> studentsHashtable = new Hashtable<Integer, String>(); studentsHashtable.put(1, "Andrii"); // здесь все хорошо, studentsHashtable.put(2, null); // вылетит NullPointerException |
А теперь рассмотрим разницу между Hashtable и HashMap на примере удобной таблички:
Характеристика
|
Hashtable
|
HashMap
|
Потокобезопасность
|
+
|
—
|
Синхронизированность
|
+
|
—
|
Производительность
|
Потокобезопасность и синхронизированность делает ее медленной
|
В однопоточной среде намного быстрее, чем Hashtable. Eсли вы не работаете с многопоточностью, то рекомендуется HashMap
|
Ключ == null?
|
Нельзя
|
Позволяет null ключ и null значение
|
Альтернатива
|
Нет альтернативы
|
Можно использовать ConcurrentHashMap для работы в многопоточной среде
|
Обратите внимание. Под синхронизированностью (synchonized) имеется ввиду следующее: только один поток может изменить одну таблицу в одно и то же время. Когда какой-то поток работает c Hashtable, то она закрыта для других потоков, пока не отработает один.
HashMap можно синхронизировать с помощью вызова такого метода:
1 |
Map myMap = Collections.synchonizedMap(hashMap); |
Сейчас для работы в многопоточной среде чаще стараются использовать более новую и удобную коллекцию ConcurrentHashMap, однако это тема уже другой статьи.
Вот такая коротенькая шпаргалка поможет быстро освежить в памяти важные моменты при работе с Hastable и HashMap.
Следите за обновлениями раздела Работа с Коллекциями и подписывайтесь на новые статьи!
В абзаце о Hashtable написано Пример использования HashMap: