Различия между HashMap и Hashtable? - PullRequest
       318

Различия между HashMap и Hashtable?

3465 голосов
/ 03 сентября 2008

Каковы различия между HashMap и Hashtable в Java?

Что более эффективно для непоточных приложений?

Ответы [ 34 ]

3 голосов
/ 23 июля 2013

HashMap - это класс, используемый для хранения элемента в ключе и формате value.it не является потокобезопасным. потому что он не синхронизирован. где Hashtable синхронизируется. Hashmap допускает ноль, но hastable не допускает ноль.

2 голосов
/ 07 марта 2014

Поскольку Hashtable в Java является подклассом класса Dictionary, который теперь устарел из-за существования Map Interface, он больше не используется. Более того, нет ничего такого, что вы не могли бы сделать с классом, реализующим интерфейс карты, которое вы можете сделать с помощью Hashtable.

2 голосов
/ 17 августа 2014

Старая и классическая тема, просто хочу добавить этот полезный блог, который объясняет это:

http://blog.manishchhabra.com/2012/08/the-5-main-differences-betwen-hashmap-and-hashtable/

Блог Маниша Чхабры

5 основных отличий между HashMap и Hashtable

HashMap и Hashtable оба реализуют интерфейс java.util.Map, но есть Есть некоторые различия, которые разработчики Java должны понимать, чтобы написать более эффективный код. Начиная с платформы Java 2 v1.2, класс Hashtable был модернизирован для реализации интерфейса карты, что делает его членом платформа коллекций Java.

  1. Одним из основных различий между HashMap и Hashtable является то, что HashMap не синхронизирован, тогда как Hashtable синхронизирован, что означает, что Hashtable является поточно-ориентированным и может использоваться несколькими потоки, но HashMap не может быть разделен между несколькими потоками без правильная синхронизация. Java 5 представила ConcurrentHashMap, который альтернатива Hashtable и обеспечивает лучшую масштабируемость, чем Hashtable в Java. Синхронизированный означает, что только один поток может изменить хэш стол в один момент времени. В основном это означает, что любой поток до при выполнении обновления на хеш-таблице потребуется установить блокировку на объект, в то время как другие будут ждать, пока будет снята блокировка.

  2. Класс HashMap примерно эквивалентен Hashtable, за исключением того, что он допускает нулевые значения. (HashMap допускает нулевые значения в качестве ключа и значения, тогда как Hashtable не допускает нулевые значения).

  3. Третье существенное различие между HashMap и Hashtable заключается в том, что Iterator в HashMap - это отказоустойчивый итератор, а перечислителя для Hashtable нет и выкинуть ConcurrentModificationException, если какой-либо другой поток изменяет карту структурно путем добавления или удаления любого элемента, кроме собственного Итератора метод удаления () Но это не гарантированное поведение и будет сделано JVM на все возможное. Это тоже важное отличие между перечислением и итератором в Java.

  4. Еще одно заметное отличие между Hashtable и HashMap заключается в том, что из-за безопасности потоков и синхронизации Hashtable намного медленнее чем HashMap, если используется в однопоточной среде. Так что если вы не нужна синхронизация и HashMap используется только одним потоком выполнить Hashtable на Java.

  5. HashMap не гарантирует, что порядок карты будет оставаться постоянным во времени.

Обратите внимание, что HashMap можно синхронизировать с помощью

Map m = Collections.synchronizedMap(hashMap);

В заключение, существуют значительные различия между Hashtable и HashMap в Java, например потокобезопасность и скорость и на основании этого только используйте Hashtable, если вам абсолютно необходима безопасность потоков, если вы работаете Java 5 рассмотреть возможность использования ConcurrentHashMap в Java.

0 голосов
/ 21 апреля 2017

Класс Hashtable синхронизирован, то есть он предназначен для использования приложениями, которые обрабатывают несколько или многопоточный процесс. Синхронизированные классы менее эффективны в классическом случае приложения к процессу, поэтому класс Hashmap быстрее в целом. Класс HashTable не принимает значение Null ни для ключей, ни для значений, в то время как класс HashMap допускает использование одного ключа с нулем и как можно большего числа нулей.

...