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

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

4191
dmanxiii 3 Сен 2008 в 00:12
38
HashTable устарел в Java 1.7, и рекомендуется использовать реализацию ConcurrentMap.
 – 
MissFiona
10 Апр 2017 в 01:10
9
Нет, ConcurrentMap здесь не необходим, поскольку в вопросе говорится, что «беспоточные приложения» означают, что многопоточность / параллелизм не является проблемой.
 – 
Basil Bourque
29 Дек 2019 в 04:11
4
@BasilBourque, да, но я полагаю, что МиссФиона имела в виду под этим что-то вроде "HashTable, традиционно выбиралась только из-за частичной защиты многопоточности. Но это было устранено ConcurrentHashMap, поэтому это обычно считается устаревшим. Обычно рекомендуется выбирать между HashMap или ConcurrentHashMap." И я считаю, что это разумный комментарий, если она это имела в виду.
 – 
alife
27 Фев 2022 в 20:26
Согласно doi.org/10.48550/arXiv.1602.00984 Hashtable более эффективен, чем HashMap с точки зрения как энергопотребление, так и время выполнения.
 – 
aventurin
29 Июн 2022 в 22:36

30 ответов

Лучший ответ

Между HashMap и Hashtable в Java :

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

  2. Hashtable не допускает ключей или значений null. HashMap позволяет использовать один ключ null и любое количество значений null.

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

Поскольку синхронизация для вас не проблема, я бы рекомендовал HashMap. Если синхронизация становится проблемой, вы также можете посмотреть ConcurrentHashMap.

4141
Josh Brown 13 Сен 2018 в 22:38
122
Если вы хотите сделать HashMap потокобезопасным, используйте Collections.synchronizedMap().
 – 
Rok Strniša
22 Ноя 2011 в 22:48
335
Я также хотел бы отметить, что наивный подход к безопасности потоков в Hashtable («синхронизация каждого метода должна позаботиться о любых проблемах параллелизма!») Делает его намного хуже для многопоточных приложений. Лучше выполнить внешнюю синхронизацию HashMap (и подумать о последствиях) или использовать реализацию ConcurrentMap (и использовать ее расширенный API для параллелизма). Итог: единственная причина использовать Hashtable - это когда это требуется для устаревшего API (примерно с 1996 г.).
 – 
erickson
16 Мар 2012 в 21:19
8
HashMap дает программистам гибкость при написании кода threadSafe, когда они его действительно используют. Редко случалось, что мне требовались потокобезопасные коллекции, такие как ConcurrentHashMap или HashTable. Что мне нужно, так это определенный набор функций или определенных операторов в синхронизированном блоке, чтобы быть потокобезопасным.
 – 
Gaurava Agarwal
27 Июн 2016 в 12:00
6
Hashtable устарела, и мы используем HashMap для небезопасной среды. Если вам нужна безопасность потоков, вы можете использовать Collections.synchronizedMap () или использовать ConcurrentHashMap, что более эффективно, чем хеш-таблица.
 – 
Maneesh Kumar
30 Мар 2018 в 06:45
5
Он устарел, но не устарел, и мне интересно, почему это так. Я предполагаю, что удаление этого класса (и Vector по тем же причинам) нарушит слишком много существующего кода, а аннотирование с помощью @Deprecated будет означать намерение удалить код, которого, по-видимому, нет.
 – 
Jilles van Gurp
19 Май 2018 в 11:11

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

413
kryger 7 Авг 2018 в 15:18
109
Из Hashtable javadoc (выделено мной): «Начиная с платформы Java 2 v1.2, этот класс был модифицирован для реализации интерфейса Map, сделав его членом Java Collections Framework . Однако вы правы, что это устаревший код. Все преимущества синхронизации можно получить более эффективно с помощью Collections.synchronizedMap (HashMap). (Подобно Vector, являющемуся устаревшей версией Collections.synchronizedList (ArrayList).)
 – 
Kip
20 Янв 2010 в 01:09
17
@ aberrant80: к сожалению, у вас нет выбора между ними, и вам нужно использовать Hashtable при программировании для J2ME ...
 – 
pwes
12 Янв 2012 в 12:13
Согласитесь, что «Hashtable считается устаревшим кодом». Вместо этого вы должны использовать ConcurentHashMap, если вам нужен параллелизм.
 – 
MastAvalons
17 Июн 2019 в 12:54

Этот вопрос часто задают на собеседовании, чтобы проверить, понимает ли кандидат правильное использование классов коллекции и знает ли он об имеющихся альтернативных решениях.

  1. Класс HashMap примерно эквивалентен Hashtable, за исключением того, что он не синхронизирован и допускает значения NULL. (HashMap допускает нулевые значения как ключ и значение, тогда как Hashtable не допускает null s).
  2. HashMap не гарантирует, что порядок карты останется постоянным с течением времени.
  3. HashMap не синхронизируется, тогда как Hashtable синхронизируется.
  4. Итератор в HashMap является отказоустойчивым, в то время как перечислитель для Hashtable - нет, и выдает ConcurrentModificationException, если какой-либо другой поток структурно изменяет карту, добавляя или удаляя любой элемент, кроме Iterator собственный метод remove(). Но это не гарантированное поведение, и JVM сделает все возможное.

Обратите внимание на некоторые важные термины:

  1. Синхронизированный означает, что только один поток может изменять хеш-таблицу в один момент времени. По сути, это означает, что любой поток перед выполнением обновления Hashtable должен будет получить блокировку объекта, в то время как другие будут ждать снятия блокировки.
  2. Отказоустойчивость важна в контексте итераторов. Если итератор был создан для объекта коллекции, и какой-то другой поток пытается изменить объект коллекции «структурно», будет сгенерировано исключение одновременной модификации. Однако другие потоки могут вызвать метод set, поскольку он не изменяет коллекцию «структурно». Однако, если до вызова set коллекция была структурно изменена, будет выброшено IllegalArgumentException.
  3. Структурная модификация означает удаление или вставку элемента, который может эффективно изменить структуру карты.

HashMap можно синхронизировать с помощью

Map m = Collections.synchronizeMap(hashMap);

Карта предоставляет представления коллекций вместо прямой поддержки итерации через объекты перечисления. Представления коллекций значительно улучшают выразительность интерфейса, как обсуждается далее в этом разделе. Карта позволяет вам перебирать ключи, значения или пары ключ-значение; Hashtable не предоставляет третий вариант. Карта обеспечивает безопасный способ удаления записей во время итерации; Hashtable - нет. Наконец, Map исправляет незначительный недостаток в интерфейсе Hashtable. Hashtable имеет метод contains, который возвращает истину, если Hashtable содержит заданное значение. Учитывая его имя, можно ожидать, что этот метод вернет истину, если Hashtable содержит данный ключ, потому что ключ является основным механизмом доступа для Hashtable. Интерфейс карты устраняет этот источник путаницы, переименовав метод containsValue. Кроме того, это улучшает согласованность интерфейса - containsValue параллелей containsKey.

Интерфейс карты

220
Godfather 14 Май 2021 в 20:16
65
1) Итераторы HashMap НЕ являются отказоустойчивыми. Они безотказны. Между этими двумя терминами существует огромная разница в значении. 2) Нет операции set с HashMap. 3) Операция put(...) не выбрасывает IllegalArgumentException, если было предыдущее изменение. 4) Безотказное поведение HashMap также происходит, если вы изменяете отображение. 5) Гарантируется безотказное поведение . (Что не гарантируется, так это поведение HashTable при одновременном внесении изменений. Фактическое поведение ... непредсказуемо.)
 – 
Stephen C
9 Сен 2013 в 12:14
30
6) Hashtable также не гарантирует, что порядок элементов карты будет стабильным с течением времени. (Возможно, вы путаете Hashtable с LinkedHashMap.)
 – 
Stephen C
9 Сен 2013 в 12:16
5
Кто-нибудь еще действительно обеспокоен тем, что в наши дни студенты получают ошибочную идею о том, что получение «синхронизированных версий» коллекций каким-то образом означает, что вам не нужно внешне синхронизировать составные операции? Мой любимый пример - thing.set(thing.get() + 1);, который чаще всего застает новичков врасплох как совершенно незащищенный, особенно если get() и set() - это синхронизированные методы. Многие из них ждут волшебства.
 – 
user4229245
5 Май 2015 в 01:26
2
Re 4: ConcurrentModificationException не касается потоков. Речь идет о сохранении итератора и изменении исходной коллекции, что может произойти в том же потоке.
 – 
Stefan Reich
4 Фев 2022 в 21:14

HashMap: реализация интерфейса Map, использующего хэш-коды для индексации массива. Hashtable: Привет, 1998 звонил. Они хотят вернуть свои коллекции API.

А если серьезно, тебе лучше держаться подальше от Hashtable. Для однопоточных приложений вам не нужны дополнительные накладные расходы на синхронизацию. Для приложений с высокой степенью параллелизма параноидальная синхронизация может привести к истощению, взаимоблокировкам или ненужным паузам при сборке мусора. Как указал Тим Хауленд, вместо этого вы можете использовать ConcurrentHashMap.

149
Apocalisp 5 Дек 2017 в 00:31
Это действительно имеет смысл. ConcurrentHashMaps дает вам свободу синхронизации, а отладка намного проще.
 – 
prap19
19 Ноя 2011 в 18:55

Имейте в виду, что HashTable был унаследованным классом до появления Java Collections Framework (JCF) и позже был модифицирован для реализации интерфейса Map. Так было Vector и Stack.

Поэтому всегда держитесь подальше от них в новом коде, поскольку в JCF всегда есть лучшая альтернатива , как указывали другие.

Вот шпаргалка по коллекции Java, которую вы сочтут полезным. Обратите внимание, что серый блок содержит устаревшие классы HashTable, Vector и Stack.

enter image description here

144
Pratik Khadloya 3 Июн 2015 в 08:43

Уже опубликовано много хороших ответов. Я добавляю несколько новых пунктов и резюмирую их.

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

< Сильный > HashMap

  1. HashMap не синхронизирован. Он не является потокобезопасным и не может использоваться многими потоками без надлежащего кода синхронизации.
  2. HashMap допускает один нулевой ключ и несколько нулевых значений.
  3. HashMap - новый класс, представленный в JDK 1.2.
  4. HashMap быстро.
  5. Мы можем сделать HashMap синхронизированным, вызвав этот код
    Map m = Collections.synchronizedMap(HashMap);
  6. HashMap проходит Iterator.
  7. Итератор в HashMap работает без сбоев.
  8. HashMap наследует класс AbstractMap.

Хеш-таблица

  1. Hashtable синхронизируется. Он потокобезопасен и может использоваться многими потоками.
  2. Hashtable не допускает нулевого ключа или значения.
  3. Hashtable - это устаревший класс.
  4. Hashtable работает медленно.
  5. Hashtable внутренне синхронизирован и не может быть рассинхронизирован.
  6. Hashtable проходит Enumerator и Iterator.
  7. Перечислитель в Hashtable не работает без сбоев.
  8. Hashtable наследует класс Dictionary.

Дополнительная литература В чем разница между HashMap и Hashtable в Java?

enter image description here

105
sanjeevRm 29 Май 2021 в 14:53
Почему вы говорите ~ " Hashtable - это устаревший класс "? Где для этого есть подтверждающая документация.
 – 
IgorGanapolsky
24 Мар 2017 в 22:29
Поддержка HashMap дороже, чем TreeMap. Потому что HashMap создает ненужные дополнительные ведра.
 – 
Abdul
30 Июл 2018 в 05:05
LinkedHashMap имеет двусвязный список записей, а не сегментов. Сегменты доступны через индексы массива и не нуждаются в связывании.
 – 
thomas.schuerger
4 Фев 2021 в 18:15
Исследование 2016 года, проведенное Pereira et al. обнаружил, что Hashtable быстрее, чем HashMap для большинства методов, особенно для containsKey, get, put и remove (arXiv:1602.00984). Таким образом, ваши утверждения «HashMap работает быстро» и «Hashtable работает медленно», скорее всего, ложны.
 – 
aventurin
29 Июн 2022 в 22:05
Я думаю, что выражения «может/не может быть разделена между многими потоками» могут ввести в заблуждение новичков. «нельзя поделиться» не означает буквально не может быть передано. Может быть, лучше было бы сказать «не следует разглашать». Но я не носитель английского языка, так что... :)
 – 
starriet
24 Июл 2022 в 02:17

Взгляните на эту диаграмму. Он обеспечивает сравнение между различными структурами данных вместе с HashMap и Hashtable. Сравнение точное, ясное и легкое для понимания.

Матрица коллекции Java

74
Yousha Aleayoub 22 Ноя 2019 в 20:34

В дополнение к тому, что сказано в izb, HashMap допускает нулевые значения, а Hashtable - нет.

Также обратите внимание, что Hashtable расширяет класс Dictionary, который как Javadocs устарело и было заменено интерфейсом Map.

72
matt b 3 Сен 2008 в 00:30

Hashtable похож на HashMap и имеет аналогичный интерфейс. Рекомендуется использовать HashMap, если вам не требуется поддержка устаревших приложений или вам нужна синхронизация, поскольку методы Hashtables синхронизируются. Так что в вашем случае, поскольку вы не используете многопоточность, HashMaps - ваш лучший выбор.

54
nbro 2 Мар 2015 в 11:55

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

Мой источник: http://javarevisited.blogspot.com/2010/ 10 / разница-между-hashmap-and.html

40
Neerja 8 Сен 2011 в 10:40

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

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

33
SkyWalker 24 Янв 2014 в 12:35

Основываясь на информации, здесь, я бы рекомендовал использовать HashMap. Я думаю, что самым большим преимуществом является то, что Java не позволит вам изменить его во время итерации, если вы не сделаете это через итератор.

31
pkaeding 3 Сен 2008 в 00:14
1
Я почти уверен, что он вызовет исключение ConncurrentModificationException до того, как будет изменена базовая коллекция, хотя я могу ошибаться.
 – 
pkaeding
1 Янв 2011 в 04:46
Он попытается обнаружить одновременную модификацию и выдаст исключение. Но если вы что-то делаете с потоками, это не дает никаких обещаний. Произойти может абсолютно все, в том числе поломка.
 – 
cHao
18 Апр 2011 в 18:03

Для многопоточных приложений часто можно обойтись ConcurrentHashMap - в зависимости от ваших требований к производительности.

19
Tim Howland 3 Сен 2008 в 02:38

1. Hashmap и HashTable хранят ключ и значение.

2. Hashmap может хранить один ключ как null. Hashtable не может хранить null.

3. HashMap не синхронизируется, но Hashtable синхронизируется.

4. HashMap можно синхронизировать с Collection.SyncronizedMap(map)

Map hashmap = new HashMap();

Map map = Collections.SyncronizedMap(hashmap);
18
Jared Burrows 22 Мар 2015 в 18:43

Помимо уже упомянутых различий, следует отметить, что начиная с Java 8, HashMap динамически заменяет узлы (связанный список), используемые в каждом сегменте, на TreeNodes (красно-черное дерево), так что даже при наличии большого количества коллизий хеширования , наихудший случай при поиске -

O (log (n)) для HashMap Vs O (n) в Hashtable.

* Вышеупомянутое улучшение еще не было применено к Hashtable, а только к HashMap, LinkedHashMap и ConcurrentHashMap.

К вашему сведению, в настоящее время

  • TREEIFY_THRESHOLD = 8: если корзина содержит более 8 узлов, связанный список преобразуется в сбалансированное дерево.
  • UNTREEIFY_THRESHOLD = 6: когда корзина становится слишком маленькой (из-за удаления или изменения размера), дерево преобразуется обратно в связанный список.
17
Kostas Kryptos 4 Май 2016 в 18:04
Конечно, это дерево помогает только тогда, когда хеш-коды ключей на самом деле разные и просто попадают в одно и то же ведро, а не тогда, когда вы действительно получаете много ключей с одинаковым хеш-кодом.
 – 
Paŭlo Ebermann
31 Окт 2021 в 13:44

У HashTable и HashMaps есть 5 основных отличий.

  1. Карты позволяют вам перебирать и извлекать ключи, значения и обе пары ключ-значение, а у HashTable нет всех этих возможностей.
  2. В Hashtable есть функция contains (), которую очень сложно использовать. Потому что значение содержит несколько отклонений. Значит ли это содержит ключ или содержит значение? сложно понять. То же самое и в Maps, у нас есть функции ContainsKey () и ContainsValue (), которые очень легко понять.
  3. В hashmap вы можете безопасно удалить элемент во время итерации. где это невозможно в хэш-таблицах.
  4. Хэш-таблицы по умолчанию синхронизированы, поэтому их можно легко использовать с несколькими потоками. Где, поскольку HashMaps не синхронизируются по умолчанию, поэтому могут использоваться только с одним потоком. Но вы все равно можете преобразовать HashMap в синхронизированный с помощью функции synchronizedMap (Map m) класса утилит Collections.
  5. HashTable не допускает пустых ключей или нулевых значений. Где, поскольку HashMap допускает один нулевой ключ и несколько нулевых значений.
15
Brad Larson 10 Апр 2014 в 19:44

Мой небольшой вклад:

  1. Первое и наиболее существенное различие между Hashtable и HashMap заключается в том, что HashMap не является поточно-ориентированной коллекцией, а Hashtable - поточно-ориентированной коллекцией. / p>

  2. Второе важное различие между Hashtable и HashMap - это производительность, поскольку HashMap не синхронизируется, он работает лучше, чем Hashtable.

  3. Третье отличие Hashtable от HashMap заключается в том, что Hashtable является устаревшим классом, и вам следует использовать ConcurrentHashMap вместо Hashtable в Java. .

13
Community 20 Июн 2020 в 12:12

HashMap: это класс, доступный внутри пакета java.util, который используется для хранения элемента в формате ключа и значения.

Hashtable: это устаревший класс, который распознается в рамках коллекции.

13
Pang 28 Дек 2018 в 05:05
  1. Hashtable синхронизируется, а HashMap - нет.
  2. Другое отличие состоит в том, что итератор в HashMap отказоустойчив. в то время как перечислитель для Hashtable - нет. Если вы измените карту во время итерации вы узнаете.
  3. HashMap допускает в нем нулевые значения, а Hashtable - нет.
12
Ihor Patsian 16 Авг 2019 в 22:08
4
Итератор HashMap работает без сбоев, но не без сбоев. Вот почему у нас есть ConcurrentHashMap, который позволяет изменять во время итерации. Проверьте это сообщение journaldev. ru / 122 /…
 – 
Pankaj
29 Янв 2013 в 01:13

HashTable - это устаревший класс в jdk, который не следует больше использовать. Замените его использование ConcurrentHashMap . Если вам не требуется безопасность потоков, используйте HashMap , который не потокобезопасен но быстрее и использует меньше памяти.

10
jontejj 21 Апр 2013 в 21:27
Потому что я думал, что в то время другие ответы не отклоняли HashTable, но объясняли, что это потокобезопасный. На самом деле, как только вы видите HashTable в коде, вы должны без промедления заменить его на ConcurrentHashMap. И если безопасность потоков не вызывает беспокойства, HashMap можно использовать для небольшого повышения производительности.
 – 
jontejj
7 Авг 2015 в 11:29

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

enter image description here

10
DeC 30 Окт 2019 в 14:32

Hashtable:

Хеш-таблица - это структура данных, в которой хранятся значения пары "ключ-значение". Нулевое значение не допускается как для ключей, так и для значений. Вы получите NullPointerException, если добавите нулевое значение. Это синхронизировано. Так что это связано с его стоимостью. Только один поток может получить доступ к HashTable в определенное время.

Пример :

import java.util.Map;
import java.util.Hashtable;

public class TestClass {

    public static void main(String args[ ]) {
    Map<Integer,String> states= new Hashtable<Integer,String>();
    states.put(1, "INDIA");
    states.put(2, "USA");

    states.put(3, null);    //will throw NullPointerEcxeption at runtime

    System.out.println(states.get(1));
    System.out.println(states.get(2));
//  System.out.println(states.get(3));

    }
}

HashMap:

HashMap похож на Hashtable , но также принимает пару "ключ-значение". Он допускает значение null как для ключей, так и для значений. Его производительность лучше, чем у HashTable, потому что это unsynchronized.

Пример:

import java.util.HashMap;
import java.util.Map;

public class TestClass {

    public static void main(String args[ ]) {
    Map<Integer,String> states = new HashMap<Integer,String>();
    states.put(1, "INDIA");
    states.put(2, "USA");

    states.put(3, null);    // Okay
    states.put(null,"UK");

    System.out.println(states.get(1));
    System.out.println(states.get(2));
    System.out.println(states.get(3));

    }
}
9
manojgolty 26 Апр 2016 в 12:46

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

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 был модифицирован для реализации интерфейса Map, что сделало его членом Java Collections Framework.

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

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

  3. Третье существенное различие между HashMap и Hashtable состоит в том, что Iterator в HashMap является итератором, работающим без сбоев, в то время как перечислитель для Hashtable нет и бросить ConcurrentModificationException, если какой-либо другой поток изменяет карту структурно путем добавления или удаления любого элемента, кроме собственного Iterator remove () метод. Но это не гарантированное поведение и будет сделано JVM изо всех сил. Это тоже важное отличие между Enumeration и Iterator в 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.

6
BalusC 6 Авг 2015 в 11:04
ConcurrentHashMap не синхронизируется по чтению, тогда как Hashtable -. Поэтому, если у вас много операций чтения, выполняемых одновременно с записью, Hashtable послужит вам лучше, если вы заботитесь о целостности данных.
 – 
IgorGanapolsky
24 Мар 2017 в 22:27

Синхронизация или многопоточность:

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

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

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

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

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

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

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

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

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

См. http://modernpathshala.com/Article/1020/ разница-между-хэш-картой-и-хэш-таблицей-в-java для примеров и вопросов для интервью и викторины, связанной с коллекцией Java

6
amitguptageek 10 Апр 2016 в 07:46

Обратите внимание, что во многих ответах указано, что Hashtable синхронизирован. На практике это вам очень мало. Синхронизация методов доступа / мутатора остановит одновременное добавление или удаление двух потоков с карты, но в реальном мире вам часто потребуется дополнительная синхронизация.

Очень распространенная идиома - «проверить, затем поместить», т.е. найти запись в Map и добавить ее, если она еще не существует. Это ни в коем случае не атомарная операция, независимо от того, используете ли вы Hashtable или HashMap.

Эквивалентно синхронизированный HashMap можно получить:

Collections.synchronizedMap(myMap);

Но для корректной реализации этой логики вам потребуется дополнительная синхронизация формы:

synchronized(myMap) {
    if (!myMap.containsKey("tomato"))
        myMap.put("tomato", "red");
}

Даже перебор записей Hashtable (или HashMap, полученных Collections.synchronizedMap) не является потокобезопасным, если вы также не защитите Map от изменения посредством дополнительной синхронизации.

Реализации ConcurrentMap интерфейс (например, ConcurrentHashMap) решить некоторые из этих проблем, включив поточно-безопасную семантику проверки и действия , например:

ConcurrentMap.putIfAbsent(key, value);
769
Godfather 15 Май 2021 в 14:22
59
Также обратите внимание, что если HashMap изменяется, итераторы, указывающие на него, становятся недействительными.
 – 
Chris K
23 Апр 2009 в 02:03
3
Так есть ли разница между синхронизированным (myMap) {...} и ConcurrentHashMap с точки зрения безопасности потоков?
 – 
telebog
11 Ноя 2011 в 20:48
Находясь в составе группы разработчиков JVM в течение нескольких лет, я могу заявить, что внутренняя синхронизация Hashtable, по крайней мере, полезна для того, чтобы правильно указывать пальцем на код клиента, когда он пишет изворотливый параллельный код. Мы получили несколько жалоб на сбои внутри HashMap (и, следовательно, «очевидно» ошибку JDK / JVM), когда причиной была одновременная модификация.
 – 
Hot Licks
20 Авг 2014 в 19:34
Реализация Collections.synchronizedMap включает синхронизированный putIfAbsent, поэтому вам не нужно самостоятельно использовать containsKey/put.
 – 
A248
7 Янв 2021 в 19:55

HashMap и HashTable

  • Некоторые важные моменты о HashMap и HashTable. пожалуйста, прочтите подробности ниже.

1) Hashtable и Hashmap реализуют интерфейс java.util.Map 2) Hashmap и Hashtable являются коллекцией на основе хешей. и работаем над хешированием. так что это сходство HashMap и HashTable.

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

1) Первое отличие заключается в том, что HashMap не является потокобезопасным, а HashTable - ThreadSafe
2) HashMap лучше с точки зрения производительности, потому что он не является потокобезопасным. в то время как производительность Hashtable не лучше, потому что она потокобезопасна. поэтому несколько потоков не могут одновременно получить доступ к Hashtable.

10
Pawan Patil 25 Июл 2017 в 17:59
2
Проголосовали против, потому что этот ответ в некоторых аспектах неверен. Hashtable не реализует интерфейс Map, а только расширяет устаревший класс Dictionary.
 – 
Ioannis Sermetziadis
25 Окт 2017 в 08:42
По крайней мере, в Java 6 API, Hashtable также реализует интерфейс карты.
 – 
Paŭlo Ebermann
31 Окт 2021 в 13:48

Помимо всех других важных аспектов, уже упомянутых здесь, API коллекций (например, интерфейс карты) постоянно модифицируется, чтобы соответствовать «последним и наиболее значительным» дополнениям к спецификации Java.

Например, сравните итерацию Java 5 Map:

for (Elem elem : map.keys()) {
  elem.doSth();
}

По сравнению со старым подходом Hashtable:

for (Enumeration en = htable.keys(); en.hasMoreElements(); ) {
  Elem elem = (Elem) en.nextElement();
  elem.doSth();
}

В Java 1.8 нам также обещают иметь возможность создавать и получать доступ к HashMaps, как в старых добрых языках сценариев:

Map<String,Integer> map = { "orange" : 12, "apples" : 15 };
map["apples"];

Обновление: Нет, в 1.8 они не появятся ... :(

Будут ли улучшения коллекции Project Coin в JDK8?

40
Community 23 Май 2017 в 15:34
1
«Новый способ» также работает для Hashtable (поскольку он также реализует интерфейс карты).
 – 
Paŭlo Ebermann
31 Окт 2021 в 13:39
Чтобы быть точным, Hashtable не реализует ни Map, ни Iterable (что требуется для "нового" синтаксиса foreach). Однако Hashtable.keySet() возвращает Set, что действительно допускает такой синтаксис.
 – 
pwes
3 Ноя 2021 в 12:55
Обновление: на самом деле оно действительно реализует Map... рад, что его исправили после стольких лет невежества.
 – 
pwes
3 Ноя 2021 в 13:02

Hashtable синхронизируется, а HashMap - нет. Это делает Hashtable медленнее, чем Hashmap.

Для однопоточных приложений используйте HashMap, поскольку в остальном они одинаковы с точки зрения функциональности.

47
Koray Tugay 15 Сен 2020 в 23:28
  • HashTable синхронизируется, если вы его используете. в одном потоке вы можете использовать HashMap, это несинхронизированная версия. Несинхронизированные объекты часто немного более производительны. Между прочим, если несколько потоков обращаются к HashMap одновременно, и хотя бы один из потоков структурно модифицирует карту, она должна быть синхронизирована извне. Вы можете обернуть несинхронизированную карту в синхронизированную, используя:

    Map m = Collections.synchronizedMap(new HashMap(...));
    
  • HashTable может содержать только ненулевой объект в качестве ключа или значения. HashMap может содержать один нулевой ключ и нулевые значения.

  • Итераторы, возвращаемые Map, являются отказоустойчивыми, если карта структурно изменена в любое время после создания итератора любым способом, кроме как с помощью собственного метода удаления итератора, итератор выдаст ConcurrentModificationException. Таким образом, перед лицом одновременной модификации итератор быстро и чисто дает сбой, а не рискует произвольным, недетерминированным поведением в неопределенное время в будущем. Поскольку перечисления, возвращаемые методами ключей и элементов Hashtable, не являются отказоустойчивыми.

  • HashTable и HashMap являются членами платформы коллекций Java (начиная с платформы Java 2 v1.2, HashTable был модифицирован для реализации интерфейса Map).

  • HashTable считается устаревшим кодом, в документации рекомендуется использовать ConcurrentHashMap вместо Hashtable, если требуется потокобезопасная высокопараллельная реализация.

  • HashMap не гарантирует порядок, в котором возвращаются элементы. Для HashTable, я думаю, это то же самое, но я не совсем уверен, я не нахожу ресурсов, которые четко заявляют об этом.

33
alain.janinm 29 Апр 2012 в 17:57

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

5
pong 15 Июл 2013 в 13:54
Это исчерпывающее описание различий между двумя API?
 – 
IgorGanapolsky
24 Мар 2017 в 22:04
Да (sic!). Это все, что разработчики GWT должны знать об этом.
 – 
pong
24 Мар 2017 в 22:41