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

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

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

+3217
02 сент. '08 в 20:12
источник поделиться
39 ответов
  • 1
  • 2

Синхронизация или безопасность потоков:

Хэш-карта не синхронизируется, поэтому она не защищена и не может быть разделена между несколькими потоками без надлежащего синхронизированного блока, тогда как Hashtable синхронизируется и, следовательно, является потокобезопасной.

Нулевые ключи и нулевые значения:

HashMap позволяет использовать один нулевой ключ и любое количество нулевых значений. Hashtable не разрешает нулевые ключи или значения.

Итерирование значений:

Итератор в HashMap является отказоустойчивым итератором, в то время как перечислитель для Hashtable не является и бросает ConcurrentModificationException, если какой-либо другой поток модифицирует структуру структурно, добавляя или удаляя любой элемент, кроме собственного метода remove() Iterators.

Суперкласс и наследие:

HashMap является подклассом класса AbstractMap, тогда как Hashtable является подклассом класса Dictionary.

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

Поскольку HashMap не синхронизирован, он быстрее по сравнению с Hashtable.

Обратитесь http://modernpathshala.com/Article/1020/difference-between-hashmap-and-hashtable-in-java к примерам и опросите вопросы и опрос, связанные с сборкой Java

+4
05 янв. '16 в 18:35
источник

HashMap эмулируется и поэтому может использоваться в GWT client code, тогда как Hashtable не является.

+4
15 июл. '13 в 9:54
источник

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

+3
23 июл. '13 в 15:50
источник

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

+2
07 мар. '14 в 15:02
источник

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

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.

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

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

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

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

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

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

Map m = Collections.synchronizedMap(hashMap);

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

+2
17 авг. '14 в 9:58
источник

1.HashMap не синхронизируется, тогда как Hashtable синхронизируется.

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

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

+1
04 дек. '14 в 12:22
источник

HashTable устарел в Java 1.7, и рекомендуется использовать реализацию ConcurrentMap

+1
09 апр. '17 в 22:10
источник

Ниже приведены некоторые различия между Hashmap и Hashtable:

Примечание. Hashtable был obselete в Java 1.7, и рекомендуется использовать ConcurrentMap.

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

Нулевые ключи и нулевые значения: HashMap допускает один нулевой ключ и любое количество нулевых значений, в то время как Hashtadoese не разрешает нулевые ключи и нулевые значения в объекте Hashtable.

Итерирование значений: значения объекта HashMap повторяются с помощью итератора. Hashtable - единственный класс, отличный от вектора, который использует перечислитель для итерации значений объекта Hashtable.

Истребитель с быстрым хостом: итератор в HashMap - это быстрый итератор, в то время как перечислитель для Hashtable - нет. Согласно Oracle Docs, если Hashtable структурно модифицируется в любое время после создания итератора каким-либо образом, кроме метода удаления итератора, то итератор будет вызывать ConcurrentModification Exception. Структурная модификация означает добавление или удаление элементов из объекта Collection (здесь HashMap или Hashtable). Таким образом, перечисления, возвращаемые ключами и элементами Hashtable, не ускоряются быстро. Мы уже объяснили разницу между итератором и перечислением.

Производительность: HashMap намного быстрее и использует меньше памяти, чем Hashtable, поскольку прежняя несинхронизирована. Несинхронизированные объекты часто намного лучше в производительности по сравнению с синхронизированным объектом, например Hashtable, в однопоточной среде.

Superclass и Legacy: Hashtable - это подкласс класса Dictionary, который теперь устарел в JDK 1.7, поэтому он больше не используется. Лучше синхронизировать HashMap извне или использовать реализацию ConcurrentMap (например, ConcurrentHashMap).HashMap является подклассом класса AbstractMap. Хотя Hashtable и HashMap имеют разные суперклассы, они оба являются реализациями абстрактного типа данных "Карта".

0
23 окт. '18 в 7:20
источник

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

0
21 апр. '17 в 15:41
источник
  • 1
  • 2

Посмотрите другие вопросы по меткам или Задайте вопрос