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

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

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

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

MissFiona 10.04.2017 01:10

@MissFiona Нет, здесь ConcurrentMap является необходимым нет, поскольку в вопросе говорится, что «беспоточные приложения» означают, что многопоточность / параллелизм не является проблемой.

Basil Bourque 29.12.2019 04:11
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3 906
2
1 585 104
35
Перейти к ответу Данный вопрос помечен как решенный

Ответы 35

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

На самом деле это не предотвращает, а просто обнаруживает и выдает ошибку.

Bart van Heukelom 18.12.2010 04:44

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

pkaeding 01.01.2011 04:46

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

cHao 18.04.2011 18:03

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

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

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

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

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

но это не делает HashTable устаревшим, не так ли?

Pacerier 02.11.2011 00:22

@Pacerier HashTable устарел, начиная с Java 1.7.

Majid Ali Khan 23.05.2019 14:25

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

Ответ принят как подходящий

Есть несколько различий между HashMap и Hashtable в Java:

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

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

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

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

Если вы хотите сделать HashMap поточно-ориентированным, используйте Collections.synchronizedMap().

Rok Strniša 22.11.2011 22:48

Я также хотел бы отметить, что наивный подход к безопасности потоков в Hashtable («синхронизация каждого метода должна решить любые проблемы параллелизма!») Делает его очень хуже для многопоточных приложений. Лучше выполнить внешнюю синхронизацию HashMap (и подумать о последствиях) или использовать реализацию ConcurrentMap (и использовать ее расширенный API для параллелизма). Итог: единственная причина использовать Hashtable - это когда он требуется для устаревшего API (примерно с 1996 г.).

erickson 16.03.2012 21:19

HashMap дает программистам гибкость при написании кода threadSafe, когда они его действительно используют. Редко случалось, что мне требовались потокобезопасные коллекции, такие как ConcurrentHashMap или HashTable. Что мне нужно, так это определенный набор функций или определенных операторов в синхронизированном блоке, чтобы быть потокобезопасным.

Gaurava Agarwal 27.06.2016 12:00

Hashtable устарела, и мы используем HashMap для небезопасной среды. Если вам нужна потокобезопасность, вы можете использовать Collections.synchronizedMap () или использовать ConcurrentHashMap, что более эффективно, чем хеш-таблица.

Maneesh Kumar 30.03.2018 06:45

Он устарел, но не устарел, и мне интересно, почему это так. Я предполагаю, что удаление этого класса (и Vector по тем же причинам) нарушит слишком много существующего кода, а аннотирование с помощью @Deprecated будет означать намерение удалить код, которого, по-видимому, нет.

Jilles van Gurp 19.05.2018 11:11

Вы также можете использовать ConcurrentSkipListMap (docs.oracle.com/javase/10/docs/api/java/util/concurrent/…). Это потокобезопасная коллекция, аналогичная ConcurrentHashMap, и эта карта сортируется в соответствии с естественным порядком ее ключей или компаратором, предоставленным во время создания карты.

rashid 25.06.2018 10:25

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

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

Это действительно имеет смысл. ConcurrentHashMaps дает вам свободу синхронизации, а отладка намного проще.

prap19 19.11.2011 18:55

Это специфично для Java или для всей реализации хэш-карты.

user6552957 01.09.2018 22:23

Обратите внимание, что во многих ответах указано, что 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);

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

Chris K 23.04.2009 02:03

Так есть ли разница между синхронизированным (myMap) {...} и ConcurrentHashMap с точки зрения безопасности потоков?

telebog 11.11.2011 20:48

Совершенно верно, я попытался объяснить то же самое здесь .. lovehasija.com/2012/08/16/…

Love Hasija 20.09.2012 14:21

@Bhushan: он будет бросать изо всех сил, это не гарантированное поведение: docs.oracle.com/javase/7/docs/api/java/util/HashMap.html

Matt Stephenson 03.10.2013 22:49

Находясь в составе группы разработчиков JVM в течение нескольких лет, я могу заявить, что внутренняя синхронизация Hashtable, по крайней мере, полезна для того, чтобы правильно указывать пальцем на код клиента, когда он пишет изворотливый параллельный код. Мы получили несколько жалоб на сбои внутри HashMap (и, следовательно, «очевидно» ошибку JDK / JVM), когда причиной была одновременная модификация.

Hot Licks 20.08.2014 19:34

Реализация Collections.synchronizedMap включает синхронизированный putIfAbsent, поэтому вам не нужно использовать containsKey / put самостоятельно.

A248 07.01.2021 19:55

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

Из Hashtable javadoc (выделено мной): «Начиная с платформы Java 2 v1.2, этот класс был модифицирован для реализации интерфейса карты, сделать его членом Java Collections Framework». Однако вы правы, что это устаревший код. Все преимущества синхронизации можно получить более эффективно с помощью Collections.synchronizedMap (HashMap). (Подобно Vector, являющемуся устаревшей версией Collections.synchronizedList (ArrayList).)

Kip 20.01.2010 01:09

@ aberrant80: к сожалению, у вас нет выбора между ними, и вам нужно использовать Hashtable при программировании для J2ME ...

pwes 12.01.2012 12:13

этот ответ следует удалить. он содержит неверную информацию и имеет много положительных отзывов.

anon58192932 22.01.2016 23:40

@ anon58192932 Можно ли отредактировать вопрос, чтобы исправить?

GC_ 14.10.2016 18:39

Мы должны привлечь внимание автора @ aberrant80 или администратора, отметив его. Пометка может помочь - сейчас попробую.

anon58192932 14.10.2016 23:05

Согласитесь, что «Hashtable считается устаревшим кодом». Вместо этого вы должны использовать ConcurentHashMap, если вам нужен параллелизм.

MastAvalons 17.06.2019 12:54

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

Мой источник: http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html

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

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

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

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

HashMap может быть синхронизирован

Map m = Collections.synchronizeMap(hashMap);

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

The Map Interface

Этот ответ содержит как минимум 2 существенные фактические неточности. Это определенно НЕ заслуживает такого количества голосов.

Stephen C 09.09.2013 12:05

1) Итераторы HashMap НЕ являются отказоустойчивыми. Они безотказны. Между этими двумя терминами существует огромная разница в значении. 2) На set нет операции HashMap. 3) Операция put(...) не выберет IllegalArgumentException, если было предыдущее изменение. 4) Отказоустойчивое поведение HashMapтакже происходит, если вы изменяете отображение. 5) Гарантированное безотказное поведение является. (Что не гарантируется, так это поведение HashTable при одновременном внесении изменений. Фактическое поведение ... непредсказуемо.)

Stephen C 09.09.2013 12:14

6) Hashtable также не гарантирует, что порядок элементов карты будет стабильным с течением времени. (Возможно, вы путаете Hashtable с LinkedHashMap.)

Stephen C 09.09.2013 12:16

Кто-нибудь еще действительно обеспокоен тем, что в наши дни студенты получают ошибочную идею о том, что получение «синхронизированных версий» коллекций каким-то образом означает, что вам не нужно внешне синхронизировать составные операции? Мой любимый пример - thing.set(thing.get() + 1);, который чаще всего застает новичков врасплох как совершенно незащищенный, особенно если get() и set() являются синхронизированными методами. Многие из них ждут волшебства.

user4229245 05.05.2015 01:26

Итераторы на HashMap не безотказны

Abdul 30.07.2018 04:56

Помимо всех других важных аспектов, уже упомянутых здесь, 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?

  • Хеш-таблица синхронизирован, если вы используете его в одном потоке, вы можете использовать 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, я думаю, это то же самое, но я не совсем уверен, я не нахожу ресурсов, которые четко заявляют об этом.

HashMaps дает вам свободу синхронизации, а отладка намного проще

Что означает ~ "свобода синхронизации"?

IgorGanapolsky 24.03.2017 22:03

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

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

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

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

  1. Hashtable синхронизирован, а HashMap - нет.
  2. Еще одно отличие состоит в том, что итератор в HashMap отказоустойчив. в то время как перечислитель для Hashtable - нет. Если вы измените карту во время итерации вы узнаете.
  3. HashMap допускает в нем нулевые значения, а Hashtable - нет.

Итератор HashMap работает без сбоев, а не без сбоев. Вот почему у нас есть ConcurrentHashMap, который позволяет изменять во время итерации. Отметьте этот пост journaldev.com/122/…

Pankaj 29.01.2013 01:13

@Pankaj Совершенно верно.

Gaurav 18.08.2020 15:22

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

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

Если да, то это должно быть в комментариях, а не в качестве ответа.

manikant gautam 16.10.2019 13:48

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

Потому что я думал, что в то время другие ответы не отклоняли HashTable, но объясняли, что это потокобезопасный. На самом деле, как только вы видите HashTable в коде, вы должны без промедления заменить его на ConcurrentHashMap. И если безопасность потоков не вызывает беспокойства, HashMap можно использовать для небольшого повышения производительности.

jontejj 07.08.2015 11:29

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

Это исчерпывающее описание различий между двумя API?

IgorGanapolsky 24.03.2017 22:04

Да (sic!). Это все, что разработчики GWT должны знать об этом.

pong 24.03.2017 22:41

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

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

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

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

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

  1. First and most significant different between Hashtable and HashMap is that, HashMap is not thread-safe while Hashtable is a thread-safe collection.

  2. Second important difference between Hashtable and HashMap is performance, since HashMap is not synchronized it perform better than Hashtable.

  3. Third difference on Hashtable vs HashMap is that Hashtable is obsolete class and you should be using ConcurrentHashMap in place of Hashtable in Java.

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

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

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

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.

Проголосовали против, потому что этот ответ в некоторых аспектах неверен. Hashtable не реализует интерфейс Map, а только расширяет устаревший класс Dictionary.

Ioannis Sermetziadis 25.10.2017 08:42

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

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

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

The 5 main differences betwen HashMap and Hashtable

HashMap and Hashtable both implement java.util.Map interface but there are some differences that Java developers must understand to write more efficient code. As of the Java 2 platform v1.2, Hashtable class was retrofitted to implement the Map interface, making it a member of the Java Collections Framework.

  1. One of the major differences between HashMap and Hashtable is that HashMap is non-synchronized whereas Hashtable is synchronized, which means Hashtable is thread-safe and can be shared between multiple threads but HashMap cannot be shared between multiple threads without proper synchronization. Java 5 introduced ConcurrentHashMap which is an alternative of Hashtable and provides better scalability than Hashtable in Java.Synchronized means only one thread can modify a hash table at one point of time. Basically, it means that any thread before performing an update on a hashtable will have to acquire a lock on the object while others will wait for lock to be released.

  2. The HashMap class is roughly equivalent to Hashtable, except that it permits nulls. (HashMap allows null values as key and value whereas Hashtable doesn’t allow nulls).

  3. The third significant difference between HashMap vs Hashtable is that Iterator in the HashMap is a fail-fast iterator while the enumerator for the Hashtable is not and throw ConcurrentModificationException if any other Thread modifies the map structurally by adding or removing any element except Iterator’s own remove() method. But this is not a guaranteed behavior and will be done by JVM on best effort. This is also an important difference between Enumeration and Iterator in Java.

  4. One more notable difference between Hashtable and HashMap is that because of thread-safety and synchronization Hashtable is much slower than HashMap if used in Single threaded environment. So if you don’t need synchronization and HashMap is only used by one thread, it out perform Hashtable in Java.

  5. HashMap does not guarantee that the order of the map will remain constant over time.

Note that HashMap can be synchronized by

Map m = Collections.synchronizedMap(hashMap);

In Summary there are significant differences between Hashtable and HashMap in Java e.g. thread-safety and speed and based upon that only use Hashtable if you absolutely need thread-safety, if you are running Java 5 consider using ConcurrentHashMap in Java.

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

IgorGanapolsky 24.03.2017 22:27

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);

Hashtable:

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

Пример:

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 похож на Хеш-таблица, но также принимает пару значений ключа. Он допускает значение 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));

    }
}

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

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

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

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

Итерация значений:

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

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

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

Спектакль:

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

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

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

O (log (n)) для HashMapПротив O (n) в Hashtable.

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

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

  • TREEIFY_THRESHOLD = 8: если корзина содержит более 8 узлов, связанный список преобразуется в сбалансированное дерево.
  • UNTREEIFY_THRESHOLD = 6: когда корзина становится слишком маленькой (из-за удаления или изменения размера), дерево преобразуется обратно в связанный список.

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

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?

В значительной степени освещено в этом ответе (дублировании) - stackoverflow.com/a/39785829/432903.

prayagupd 13.03.2017 05:36

Почему вы говорите ~ "Hashtable - это унаследованный класс"? Где для этого подтверждающая документация.

IgorGanapolsky 24.03.2017 22:29

@IgorGanapolsky вы можете прочитать это - stackoverflow.com/questions/21086307/…

roottraveller 29.03.2017 12:48

Поддержка HashMap дороже, чем TreeMap. Потому что HashMap создает ненужные дополнительные ведра.

Abdul 30.07.2018 05:05

LinkedHashMap имеет двусвязный список записей, а не сегментов. Сегменты доступны через индексы массива и не нуждаются в связывании.

thomas.schuerger 04.02.2021 18:15

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

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

Hashtable является потокобезопасным и может использоваться несколькими потоками в приложении.

С другой стороны, HashMap не синхронизируется и не может быть доступен для нескольких потоков без дополнительного кода синхронизации. Мы можем использовать Collections.synchronizedMap() для создания поточно-ориентированной версии HashMap. Мы также можем просто создать собственный код блокировки или сделать его потокобезопасным с помощью ключевого слова synchronized.

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

Hashtable вообще не допускает null.

Мы должны использовать HashMap для несинхронизированного или однопоточного приложения.

Начиная с JDK 1.8, Hashtable устарел. Однако ConcurrentHashMap - отличная замена Hashtable. Мы должны рассмотреть возможность использования ConcurrentHashMap в приложениях с несколькими потоками.

Другие вопросы по теме