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

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

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

2.09.2008 20:12:00
HashTable устарел в Java 1.7, поэтому рекомендуется использовать реализацию ConcurrentMap
MissFiona 9.04.2017 22:10:19
@MissFiona Нет, ConcurrentMapздесь нет необходимости, так как в Вопросе говорится, что «непоточные приложения» означают, что многопоточность / параллелизм не является проблемой.
Basil Bourque 29.12.2019 01:11:13
30 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

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

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

3748
13.09.2018 19:38:58
Если вы хотите сделать HashMap потокобезопасным, используйте Collections.synchronizedMap().
Rok Strniša 22.11.2011 18:48:38
Я также хотел бы прокомментировать, что наивный подход к безопасности потоков в Hashtable(«синхронизация каждого метода должен решать любые проблемы с параллелизмом!») Сильно ухудшает многопоточные приложения. Вам лучше внешней синхронизации HashMap(и думать о последствиях), или использовать ConcurrentMapреализацию (и использовать его расширенный API для параллелизма). Итог: единственная причина использования Hashtable- это когда устаревший API (примерно с 1996 года) требует этого.
erickson 16.03.2012 17:19:38
HashMap дает программисту гибкость в написании кода ThreadSafe, когда он фактически его использует. Редко случалось так, что мне требовался потокобезопасный набор, такой как ConcurrentHashMap или HashTable. Что мне нужно, так это определенный набор функций или определенных операторов в синхронизированном блоке для обеспечения безопасности потоков.
Gaurava Agarwal 27.06.2016 09:00:02
Hashtable устарел, и мы используем HashMap для не поточной среды. Если вам нужна безопасность потоков, вы можете использовать Collections.synchronizedMap () или ConcurrentHashMap, который более эффективен, чем хеш-таблица.
Maneesh Kumar 30.03.2018 03:45:20
Это устарело, но не устарело, и мне интересно, почему это так. Я предполагаю, что удаление этого класса (и Vector по тем же причинам) сломало бы слишком много существующего кода, а аннотирование с помощью @Deprecated означало бы намерение удалить код, которого, очевидно, там нет.
Jilles van Gurp 19.05.2018 08:11:01

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

26
2.09.2008 20:14:53
На самом деле это не предотвращает, а просто обнаруживает и выдает ошибку.
Bart van Heukelom 18.12.2010 01:44:58
Я почти уверен, что он выдаст исключение ConncurrentModificationException до изменения базовой коллекции, хотя я могу ошибаться.
pkaeding 1.01.2011 01:46:36
Он попытается обнаружить одновременную модификацию и выдать исключение. Но если вы что-то делаете с потоками, он не может давать никаких обещаний. Абсолютно все может случиться, включая поломку .
cHao 18.04.2011 14:03:08

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

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

31
22.11.2019 17:35:51

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

49
2.03.2015 08:55:23

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

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

64
2.09.2008 20:30:00
но это не делает HashTable устаревшим, не так ли?
Pacerier 1.11.2011 20:22:58
@Pacerier HashTable устарел с версии Java 1.7.
Majid Ali Khan 23.05.2019 11:25:33

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

18
2.09.2008 22:38:59

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

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

130
4.12.2017 21:31:14
Это на самом деле имеет смысл. ConcurrentHashMaps дает вам свободу синхронизации, а отладка намного проще.
prap19 19.11.2011 14:55:20
Это специфично для Java или для всех реализаций хеш-карты.
user6552957 1.09.2018 19:23:54

Обратите внимание, что во многих ответах говорится, что 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);
675
6.03.2019 12:32:06
Также обратите внимание, что при изменении HashMap итераторы, указывающие на него, становятся недействительными.
Chris K 22.04.2009 22:03:03
Так есть ли разница между synchronized (myMap) {...} и ConcurrentHashMap с точки зрения поточной безопасности?
telebog 11.11.2011 16:48:26
Совершенно верно, я пытался объяснить то же самое здесь .. lovehasija.com/2012/08/16/…
Love Hasija 20.09.2012 10:21:08
@Bhushan: Это будет сделано изо всех сил, это не гарантированное поведение: docs.oracle.com/javase/7/docs/api/java/util/HashMap.html
Matt Stephenson 3.10.2013 18:49:41
Проработав несколько лет в команде разработчиков JVM, я могу утверждать, что внутренняя синхронизация Hashtable по крайней мере полезна для правильного указания пальцем на код клиента, когда он пишет хитрый параллельный код. Мы получили несколько жалоб о сбоях внутри HashMap (и, следовательно, «очевидно» об ошибке JDK / JVM), когда причиной была одновременная модификация.
Hot Licks 20.08.2014 15:34:31

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

359
7.08.2018 12:18:04
От Hashtable javadoc (выделение добавлено): «Начиная с платформы Java 2 v1.2, этот класс был модифицирован для реализации интерфейса Map, что сделало его членом Java Collections Framework ». Однако вы правы, что это устаревший код. Все преимущества синхронизации можно получить более эффективно с Collections.synchronizedMap (HashMap). (Подобно тому, как Vector является устаревшей версией Collections.synchronizedList (ArrayList).)
Kip 19.01.2010 22:09:03
@ aberrant80: к сожалению, у вас нет выбора между ними, и вы должны использовать Hashtable при программировании для J2ME ...
pwes 12.01.2012 08:13:48
этот ответ должен быть удален. он содержит неверную информацию и имеет много голосов.
anon58192932 22.01.2016 20:40:55
@ anon58192932 Можно ли отредактировать вопрос, чтобы это исправить?
GC_ 14.10.2016 15:39:47
Мы должны привлечь внимание автора @ aberrant80 или администратора, отметив это. Пометка может помочь - попробую сейчас.
anon58192932 14.10.2016 20:05:56

Другое ключевое отличие между hashtable и hashmap заключается в том, что Iterator в HashMap является отказоустойчивым, а перечислитель для Hashtable - нет, и генерирует исключение ConcurrentModificationException, если какой-либо другой поток изменяет карту структурно, добавляя или удаляя любой элемент, кроме собственного метода Iterator (). Но это не гарантированное поведение, и JVM сделает все возможное ».

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

36
8.09.2011 06:40:13

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

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

Примечание о некоторых важных условиях:

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

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

Map m = Collections.synchronizeMap(hashMap);

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

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

185
22.11.2019 17:34:18
Этот ответ содержит как минимум 2 существенные фактические неточности. Это, конечно, не заслуживает этого много голосов.
Stephen C 9.09.2013 08:05:51
1) Итераторы HashMap НЕ являются отказоустойчивыми. Они быстро проваливаются. Существует огромная разница в значении между этими двумя терминами. 2) Нет setоперации на HashMap. 3) put(...)Операция не сработает, IllegalArgumentExceptionесли произошли предыдущие изменения. 4) Отказоустойчивое поведение HashMap также происходит, если вы измените отображение. 5) Нерабочий-быстро поведение будет гарантировано. (Что не гарантируется, так это поведение a, HashTableесли вы делаете параллельную модификацию. Фактическое поведение ... непредсказуемо.)
Stephen C 9.09.2013 08:14:31
6) Hashtableне гарантирует, что порядок элементов карты также будет стабильным во времени. (Вы, возможно, путаете Hashtableс LinkedHashMap.)
Stephen C 9.09.2013 08:16:53
Кто-то еще действительно беспокоился о том, что в наши дни ученики заблуждаются, что получение «синхронизированных версий» коллекций означает, что вам не нужно внешне синхронизировать составные операции? Мой любимый пример этого, thing.set(thing.get() + 1);который чаще всего застает новичков врасплох как совершенно незащищенных, особенно если они get()и set()являются синхронизированными методами. Многие из них ожидают магии.
user4229245 4.05.2015 22:26:46
Итераторы в HashMap небезопасны
Abdul 30.07.2018 01:56:09

Помимо всех других важных аспектов, уже упомянутых здесь, API-интерфейс Collections (например, интерфейс Map) постоянно изменяется, чтобы соответствовать «последним и лучшим» дополнениям спецификации 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?

36
23.05.2017 12:34:53
  • HashTable синхронизируется, если вы используете его в одном потоке, вы можете использовать HashMap , который является несинхронизированной версией. Несинхронизированные объекты часто немного более производительны. Кстати, если несколько потоков одновременно обращаются к HashMap, и хотя бы один из потоков структурно изменяет карту, она должна быть синхронизирована извне. Вы можете обернуть несинхронизированную карту в синхронизированную, используя:

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

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

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

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

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

30
29.04.2012 13:57:46

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

4
9.08.2012 12:28:45
Что означает « свобода синхронизации »?
IgorGanapolsky 24.03.2017 19:03:25

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

Java Collection Matrix

61
22.11.2019 17:34:59

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

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

30
24.01.2014 08:35:04
  1. Hashtableсинхронизируется, тогда HashMapкак нет.
  2. Другое отличие состоит в том, что итератор в методе HashMapотказоустойчив, а перечислитель Hashtable- нет. Если вы измените карту во время итерации, вы будете знать.
  3. HashMapразрешает нулевые значения в нем, пока Hashtableнет.
10
16.08.2019 19:08:44
Итератор HashMap является отказоустойчивым и небезопасным. Вот почему у нас есть ConcurrentHashMap, который позволяет модификацию во время итерации. Проверьте это сообщение journaldev.com/122/…
Pankaj 28.01.2013 21:13:09

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

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

11
28.12.2018 02:05:18
Если это так, это должно быть в комментариях, а не в качестве ответа.
manikant gautam 16.10.2019 10:48:21

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

10
21.04.2013 17:27:22
Потому что я думал, что другие ответы в то время не отклоняли HashTable, а объясняли, что он безопасен для потоков. Правда в том, что как только вы видите HashTable в коде, вы должны заменить его на ConcurrentHashMap, не пропуская удар. И если безопасность потоков не является проблемой, HashMap может быть использован для повышения производительности.
jontejj 7.08.2015 08:29:50

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

5
15.07.2013 09:54:10
Это полное описание различий между двумя API?
IgorGanapolsky 24.03.2017 19:04:09
Да (так!). Это все, что нужно знать разработчикам GWT.
pong 24.03.2017 19:41:44

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

3
23.07.2013 15:50:26

Есть 5 основных различий с HashTable и HashMaps.

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

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

3
28.12.2018 02:04:16

Мой маленький вклад:

  1. Первое и самое значительное различались Hashtableи в HashMapтом , что, HashMapне поточно-то время Hashtableявляется поточно-коллекция.

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

  3. Третье отличие от Hashtablevs в HashMapтом, что Hashtableэто устаревший класс, и вы должны использовать его ConcurrentHashMapвместо HashtableJava.

13
22.03.2015 15:44:33

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

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

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

введите описание изображения здесь

124
3.06.2015 05:43:33

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 одновременно.

9
25.07.2017 14:59:32
Проголосовали вниз, потому что этот ответ не является правильным в некоторых аспектах. Hashtable не реализует интерфейс Map, а только расширяет класс Dictionary, который устарел.
Yannis Sermetziadis 25.10.2017 05:42:32

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

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

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

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

5
6.08.2015 08:04:50
ConcurrentHashMap не синхронизируется по чтению, тогда как Hashtable есть. Таким образом, если у вас большое количество операций чтения, происходящих одновременно с записью, Hashtable будет лучше служить вам, если вы заботитесь о целостности данных.
IgorGanapolsky 24.03.2017 19:27:20

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);
17
22.03.2015 15:43:53

Hashtable:

Hashtable - это структура данных, которая сохраняет значения пары ключ-значение. Это не позволяет null для ключей и значений. Вы получите, 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));

    }
}
8
26.04.2016 09:46:16

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

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

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

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

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

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

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

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

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

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

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

4
10.04.2016 04:46:30