ConcurrentMapздесь нет необходимости, так как в Вопросе говорится, что «непоточные приложения» означают, что многопоточность / параллелизм не является проблемой.
ConcurrentMapздесь нет необходимости, так как в Вопросе говорится, что «непоточные приложения» означают, что многопоточность / параллелизм не является проблемой.
Ответы:
Есть несколько различий между HashMapи Hashtableв Java:
Hashtableбудет синхронизировано , тогда как это HashMapне так. Это HashMapлучше для не поточных приложений, поскольку несинхронизированные объекты обычно работают лучше, чем синхронизированные.
Hashtableне разрешает nullключи или значения. HashMapпозволяет один nullключ и любое количество nullзначений.
Одним из подклассов HashMap является LinkedHashMap, поэтому в случае, если вам нужен предсказуемый порядок итераций (по умолчанию это порядок вставки), вы можете легко поменять формулу HashMapна a LinkedHashMap. Это было бы не так просто, если бы вы использовали Hashtable.
Поскольку синхронизация не является проблемой для вас, я бы порекомендовал HashMap. Если синхронизация становится проблемой, вы также можете посмотреть ConcurrentHashMap.
Collections.synchronizedMap().
Hashtable(«синхронизация каждого метода должна решать любые проблемы с параллелизмом!») Сильно ухудшает многопоточные приложения. Вам лучше синхронизировать внешнюю HashMap(и думать о последствиях) или использовать ConcurrentMapреализацию (и использовать ее расширенный API для параллелизма). Итог: единственная причина использования Hashtable- это когда устаревший API (примерно с 1996 года) требует этого.
Обратите внимание, что во многих ответах говорится, что 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);
Hashtableсчитается устаревшим кодом. Ничего в Hashtableэтом не может быть сделано с использованием HashMapили производными HashMap, поэтому для нового кода я не вижу никакого оправдания возвращению Hashtable.
Этот вопрос часто задают на собеседовании, чтобы проверить, понимает ли кандидат правильное использование коллекционных классов и знает ли он о доступных альтернативных решениях.
HashMapКласс примерно соответствует Hashtable, за исключением того, что она не синхронизирована и разрешают нули. ( HashMapдопускает нулевые значения в качестве ключа и значения, тогда Hashtableкак не позволяетnull s).HashMap не гарантирует, что порядок карты будет оставаться постоянным во времени.HashMap не синхронизирован, тогда как Hashtable как синхронизирован.HashMapявляется отказоустойчивым, а перечислитель для Hashtableis - нет, и throw, ConcurrentModificationExceptionесли любой другой поток изменяет карту структурно, добавляя или удаляя любой элемент, кроме Iteratorсобственного remove() метода. Но это не гарантированное поведение и будет сделано JVM с максимальной отдачей.Примечание о некоторых важных условиях:
Hashtable объекта должен получить блокировку объекта, в то время как другие будут ожидать снятия блокировки.setметод, поскольку он не изменяет коллекцию «структурно». Однако, если до вызова setколлекция была изменена структурно, IllegalArgumentExceptionона будет выброшена.HashMap может быть синхронизирован
Map m = Collections.synchronizeMap(hashMap);
Карта обеспечивает представления коллекции вместо прямой поддержки итерации через объекты перечисления. Представления коллекции значительно повышают выразительность интерфейса, как будет обсуждаться далее в этом разделе. Карта позволяет перебирать ключи, значения или пары ключ-значение;
Hashtableне предоставляет третий вариант. Карта обеспечивает безопасный способ удаления записей в разгар итерации; Hashtableне. Наконец, Map исправляет незначительный недостаток Hashtableинтерфейса.
Hashtableимеет метод с названием содержит, который возвращает истину, если
Hashtableсодержит заданное значение. Учитывая его имя, вы ожидаете, что этот метод вернет true, если он Hashtableсодержит заданный ключ, потому что ключ является основным механизмом доступа для aHashtable . Интерфейс Map устраняет этот источник путаницы, переименовывая метод
containsValue, Кроме того, это улучшает согласованность интерфейса
.containsValue параллелиcontainsKey
setоперации на HashMap. 3) put(...)Операция не сработает, IllegalArgumentExceptionесли произошли предыдущие изменения. 4) Отказоустойчивое поведение HashMap также происходит, если вы измените отображение. 5) Нерабочий-быстро поведение будет гарантировано. (Что не гарантируется, так это поведение a, HashTableесли вы делаете параллельную модификацию. Фактическое поведение ... непредсказуемо.)
Hashtableне гарантирует, что порядок элементов карты также будет стабильным во времени. (Вы, возможно, путаете Hashtableс LinkedHashMap.)
thing.set(thing.get() + 1);который чаще всего застает новичков врасплох как совершенно незащищенных, особенно если они get()и set()являются синхронизированными методами. Многие из них ожидают магии.
HashMap: Реализация Mapинтерфейса, использующего хэш-коды для индексации массива.
HashtableПривет, 1998 год звонил. Они хотят вернуть свои коллекции API.
Если серьезно, вам лучше держаться подальше от Hashtableвсего. Для однопоточных приложений вам не нужны дополнительные издержки синхронизации. Для приложений с высокой степенью параллелизма параноидальная синхронизация может привести к голоданию, взаимоблокировкам или ненужным паузам сбора мусора. Как отметил Тим Хоулэнд, вы можете использовать ConcurrentHashMapвместо этого.
Имейте в виду, что это HashTableбыл унаследованный класс до появления Java Collections Framework (JCF) и позднее был модернизирован для реализации Mapинтерфейса. Так было Vectorи так Stack.
Поэтому всегда избегайте их в новом коде, поскольку в JCF всегда есть лучшая альтернатива, как указывали другие.
Вот шпаргалка по коллекции Java, которую вы найдете полезной. Обратите внимание, что серый блок содержит устаревшие классы HashTable, Vector и Stack.

Там уже много хорошего ответа уже выложено. Я добавляю несколько новых пунктов и обобщаю их.
HashMapи Hashtableоба используются для хранения данных в форме ключа и значения . Оба используют технику хеширования для хранения уникальных ключей. Но есть много различий между классами HashMap и Hashtable, которые приведены ниже.
HashMap
HashMapне синхронизирован. Он не является потокобезопасным и не может использоваться несколькими потоками без надлежащего кода синхронизации. HashMap позволяет один нулевой ключ и несколько нулевых значений. HashMap это новый класс, представленный в JDK 1.2. HashMap это быстро. HashMapкак синхронизирован, вызвав этот кодMap m = Collections.synchronizedMap(HashMap); HashMap проходит через итератор. HashMapотказоустойчив. HashMap наследует класс AbstractMap. Хеш-таблица
Hashtableсинхронизирован. Это потокобезопасный и может использоваться многими потоками. Hashtable не допускает нулевой ключ или значение. Hashtable это унаследованный класс Hashtable медленный. Hashtable внутренне синхронизирован и не может быть несинхронизирован. Hashtable проходит через перечислитель и итератор. Hashtableне работает быстро. Hashtable наследует словарь класса.Дальнейшее чтение В чем разница между HashMap и Hashtable в Java?
В дополнение к тому, что сказал izb, HashMapдопускает нулевые значения, тогда как Hashtableнет.
Также обратите внимание, что Hashtableрасширяет Dictionaryкласс, который, как состояние Javadocs , устарел и был заменен Mapинтерфейсом.
Посмотрите на этот график. Это обеспечивает сравнение между различными структурами данных наряду с HashMapи Hashtable. Сравнение точное, понятное и простое для понимания.
Hashtableпохож на HashMapи имеет аналогичный интерфейс. Рекомендуется использовать HashMap, если вам не требуется поддержка устаревших приложений или синхронизация, поскольку Hashtablesметоды синхронизируются. Так что в вашем случае, поскольку вы не многопоточны, HashMapsваш лучший выбор.
Другое ключевое отличие между hashtable и hashmap заключается в том, что Iterator в HashMap работает без сбоев, а перечислитель для Hashtable - нет, и генерирует исключение ConcurrentModificationException, если какой-либо другой поток изменяет карту структурно, добавляя или удаляя любой элемент, кроме собственного метода Iterator (). Но это не гарантированное поведение, и JVM сделает все возможное ».
Мой источник: http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html
Помимо всех других важных аспектов, уже упомянутых здесь, 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 ... :(
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, я думаю, что это то же самое, но я не совсем уверен, я не нахожу ресурсы, в которых это четко указано.
HashMapа также Hashtableимеют значительные алгоритмические различия. Никто не упоминал об этом раньше, поэтому я поднимаю это. HashMapсоздаст хеш-таблицу со степенью двойки, динамически увеличит ее так, чтобы в каждом сегменте было не более восьми элементов (столкновений), и будет очень хорошо перемешивать элементы для общих типов элементов. Тем не менее, Hashtableреализация обеспечивает лучший и более точный контроль над хэшированием, если вы знаете, что делаете, а именно, вы можете фиксировать размер таблицы, используя, например, ближайшее простое число к размеру домена ваших значений, и это приведет к лучшей производительности, чем HashMap, т.е. меньше коллизий для некоторых случаев.
Помимо очевидных различий, широко обсуждаемых в этом вопросе, я рассматриваю Hashtable как автомобиль с «ручным приводом», где вы лучше контролируете хеширование, а HashMap как аналог «автоматического привода», который в целом будет работать хорошо.
Основываясь на информации здесь , я бы рекомендовал использовать HashMap. Я думаю, что самым большим преимуществом является то, что Java не позволит вам изменять его, пока вы выполняете итерацию, если вы не сделаете это через итератор.
A Collection- иногда называемый контейнером - это просто объект, который группирует несколько элементов в одну единицу. Collections используются для хранения, извлечения, манипулирования и передачи совокупных данных. Структура коллекций W представляет собой унифицированную архитектуру для представления и управления коллекциями.
И HashMap JDK1.2Hashtable JDK1.0, оба используются для представления группы объектов, представленных в <Key, Value>паре. Каждая <Key, Value>пара называется Entryобъектом. Коллекция записей ссылается на объект HashMapи Hashtable. Ключи в коллекции должны быть уникальными или отличительными. [поскольку они используются для получения сопоставленного значения определенного ключа. значения в коллекции могут быть продублированы.]
« Член суперкласса, Legacy и Collection Framework
Hashtable - это устаревший класс, представленный в JDK1.0 , который является подклассом класса Dictionary. Из JDK1.2Hashtable переработан, чтобы реализовать интерфейс Map, чтобы стать членом коллекции Framework. HashMap является членом Java Collection Framework с самого начала его появления в JDK1.2. HashMap является подклассом класса AbstractMap.
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable { ... }
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { ... }
« Начальная емкость и коэффициент загрузки
Емкость - это количество сегментов в хэш-таблице, а начальная емкость - это просто емкость на момент создания хеш-таблицы. Обратите внимание, что хеш-таблица открыта: в случае « hashcollision» в одном сегменте хранится несколько записей, которые необходимо искать последовательно. Коэффициент загрузки - это мера того, насколько полной хеш-таблице разрешено получать до того, как ее емкость будет автоматически увеличена.
HashMap создает пустую хеш-таблицу с начальной емкостью по умолчанию (16) и коэффициентом загрузки по умолчанию (0,75). Где, как Hashtable создает пустой хэш-таблицы с начальной емкостью по умолчанию (11) и коэффициентом загрузки / коэффициентом заполнения (0,75).
« Структурная модификация при столкновении хэшей
HashMap, Hashtableв случае коллизий хешей они хранят записи карты в связанных списках. Начиная с Java8,HashMap если интервал хеша выходит за пределы определенного порога, этот сегмент переключается сlinked list of entries to a balanced tree . которые улучшают производительность в худшем случае с O (n) до O (log n). При преобразовании списка в двоичное дерево хеш-код используется как переменная ветвления. Если в одном сегменте находятся два разных хэш-кода, один считается больше и идет справа от дерева, а другой - слева. Но когда оба хеш-кода равны, HashMapпредполагается, что ключи сравнимы, и сравнивает ключ для определения направления, чтобы можно было поддерживать некоторый порядок. Хорошей практикой является сопоставимых с помощью ключей, HashMap сопоставляемых . При добавлении записей, если размер корзины достигаетTREEIFY_THRESHOLD = 8Преобразовать связанный список записей в сбалансированное дерево, при удалении записей меньшеTREEIFY_THRESHOLD и, самое большее UNTREEIFY_THRESHOLD = 6, преобразует сбалансированное дерево в связанный список записей. Java 8 SRC , стека
« Итерация с использованием коллекции, Fail-Fast и Fail-Safe
+--------------------+-----------+-------------+
| | Iterator | Enumeration |
+--------------------+-----------+-------------+
| Hashtable | fail-fast | safe |
+--------------------+-----------+-------------+
| HashMap | fail-fast | fail-fast |
+--------------------+-----------+-------------+
| ConcurrentHashMap | safe | safe |
+--------------------+-----------+-------------+
Iteratorявляется безотказным по своей природе. то есть он генерирует исключение ConcurrentModificationException, если коллекция изменяется при выполнении итерации, отличной от собственного метода remove (). Где как Enumerationотказоустойчивый в природе. Он не выдает никаких исключений, если коллекция изменяется во время итерации.
Согласно Java API Docs, Iterator всегда предпочтительнее перечисления.
НОТА: . Функциональность интерфейса перечисления дублируется интерфейсом итератора. Кроме того, Iterator добавляет необязательную операцию удаления и имеет более короткие имена методов. Новые реализации должны рассмотреть возможность использования Iterator вместо Enumeration.
В Java 5 представлен интерфейс ConcurrentMap : ConcurrentHashMap- высококонкурентная, высокопроизводительная ConcurrentMapреализация, поддерживаемая хэш-таблицей. Эта реализация никогда не блокируется при выполнении поиска и позволяет клиенту выбирать уровень параллелизма для обновлений. Он предназначен в качестве замены для Hashtable: в дополнение к реализации ConcurrentMap, он поддерживает все «устаревшие» методы, свойственные Hashtable.
Каждое HashMapEntryзначение s является изменчивым обеспечивая тем самым высокую согласованность зерна для предполагаемых изменений и последующих считываний; каждое чтение отражает последнее завершенное обновление
Итераторы и перечисления являются отказоустойчивыми - отражают состояние в некоторый момент с момента создания итератора / перечисления; это позволяет одновременно считывать и модифицировать за счет снижения согласованности. Они не бросают ConcurrentModificationException. Однако итераторы предназначены для использования только одним потоком за раз.
Как и в Hashtableотличие HashMap, этот класс не позволяет использовать null в качестве ключа или значения.
public static void main(String[] args) {
//HashMap<String, Integer> hash = new HashMap<String, Integer>();
Hashtable<String, Integer> hash = new Hashtable<String, Integer>();
//ConcurrentHashMap<String, Integer> hash = new ConcurrentHashMap<>();
new Thread() {
@Override public void run() {
try {
for (int i = 10; i < 20; i++) {
sleepThread(1);
System.out.println("T1 :- Key"+i);
hash.put("Key"+i, i);
}
System.out.println( System.identityHashCode( hash ) );
} catch ( Exception e ) {
e.printStackTrace();
}
}
}.start();
new Thread() {
@Override public void run() {
try {
sleepThread(5);
// ConcurrentHashMap traverse using Iterator, Enumeration is Fail-Safe.
// Hashtable traverse using Enumeration is Fail-Safe, Iterator is Fail-Fast.
for (Enumeration<String> e = hash.keys(); e.hasMoreElements(); ) {
sleepThread(1);
System.out.println("T2 : "+ e.nextElement());
}
// HashMap traverse using Iterator, Enumeration is Fail-Fast.
/*
for (Iterator< Entry<String, Integer> > it = hash.entrySet().iterator(); it.hasNext(); ) {
sleepThread(1);
System.out.println("T2 : "+ it.next());
// ConcurrentModificationException at java.util.Hashtable$Enumerator.next
}
*/
/*
Set< Entry<String, Integer> > entrySet = hash.entrySet();
Iterator< Entry<String, Integer> > it = entrySet.iterator();
Enumeration<Entry<String, Integer>> entryEnumeration = Collections.enumeration( entrySet );
while( entryEnumeration.hasMoreElements() ) {
sleepThread(1);
Entry<String, Integer> nextElement = entryEnumeration.nextElement();
System.out.println("T2 : "+ nextElement.getKey() +" : "+ nextElement.getValue() );
//java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextNode
// at java.util.HashMap$EntryIterator.next
// at java.util.Collections$3.nextElement
}
*/
} catch ( Exception e ) {
e.printStackTrace();
}
}
}.start();
Map<String, String> unmodifiableMap = Collections.unmodifiableMap( map );
try {
unmodifiableMap.put("key4", "unmodifiableMap");
} catch (java.lang.UnsupportedOperationException e) {
System.err.println("UnsupportedOperationException : "+ e.getMessage() );
}
}
static void sleepThread( int sec ) {
try {
Thread.sleep( 1000 * sec );
} catch (InterruptedException e) {
e.printStackTrace();
}
}
« Нулевые ключи и нулевые значения
HashMapпозволяет максимум один нулевой ключ и любое количество нулевых значений. Где as Hashtableне допускает даже одного нулевого ключа и нулевого значения, если ключ или значение null, то он генерирует исключение NullPointerException.пример
« Синхронизировано, Thread Safe
Hashtableвнутренне синхронизирован. Поэтому его очень безопасно использовать Hashtableв многопоточных приложениях. Где как HashMapне внутренне синхронизировано. Поэтому использование HashMapв многопоточных приложениях без внешней синхронизации небезопасно . Вы можете внешне синхронизировать, HashMapиспользуя Collections.synchronizedMap()метод.
« Производительность
Поскольку Hashtableвнутренняя синхронизация, это делает Hashtableнемного медленнее, чем HashMap.
@Видеть
Для многопоточных приложений вы часто можете использовать ConcurrentHashMap - это зависит от ваших требований к производительности.
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);
Помимо уже упомянутых различий, следует отметить, что, начиная с Java 8, HashMapдинамически заменяет узлы (связанный список), используемые в каждом сегменте, на TreeNodes (красно-черное дерево), так что, даже если существуют коллизии с высоким хешем, наихудший случай, когда поиск является
O (log (n)) для HashMap Vs O (n) в Hashtable.
* Вышеупомянутое улучшение не применяется к Hashtableеще, но только HashMap, LinkedHashMapи ConcurrentHashMap.
К вашему сведению, в настоящее время
TREEIFY_THRESHOLD = 8 : если корзина содержит более 8 узлов, связанный список преобразуется в сбалансированное дерево.UNTREEIFY_THRESHOLD = 6 : когда область памяти становится слишком маленькой (из-за удаления или изменения размера), дерево преобразуется обратно в связанный список.Есть 5 основных различий с HashTable и HashMaps.
Мой маленький вклад:
Первое и самое значительное различались
Hashtableи вHashMapтом , что,HashMapне поточно-то времяHashtableявляется поточно-коллекция.Второе важное отличие
HashtableиHashMapявляется производительность, так какHashMapне синхронизируется это лучше , чемHashtable.Третье отличие от
Hashtablevs вHashMapтом, чтоHashtableэто устаревший класс, и вы должны использовать егоConcurrentHashMapвместоHashtableJava.
HashMap: это класс, доступный в пакете java.util, и он используется для хранения элемента в формате ключа и значения.
Hashtable: это унаследованный класс, который распознается в рамках коллекции.
HashTable - это устаревший класс в jdk, который больше не должен использоваться. Замените его использование ConcurrentHashMap . Если вам не требуется безопасность потоков, используйте HashMap, который не является потокобезопасным, но быстрее и использует меньше памяти.
Hashtableсинхронизируется, тогда HashMapкак нет.HashMapотказоустойчив, а перечислитель Hashtable- нет. Если вы измените карту во время итерации, вы будете знать.HashMapразрешает нулевые значения в нем, пока Hashtableнет.HashMap и HashTable
1) Hashtable и Hashmap реализуют интерфейс java.util.Map. 2) Hashmap и Hashtable - это основанная на хэше коллекция. и работает на хеширование. так что это сходство HashMap и HashTable.
1) Первое отличие состоит в том, что HashMap не является потокобезопасным, в то время как HashTable является ThreadSafe.
2) HashMap лучше работает с точки зрения производительности, поскольку он не безопасен для потоков. в то время как производительность Hashtable не лучше, так как она безопасна для потоков. поэтому несколько потоков не могут получить доступ к Hashtable одновременно.
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));
}
}
HashMapэмулируется и, следовательно, может использоваться в GWT client codeто время Hashtableкак нет.
Старая и классическая тема, просто хочу добавить этот полезный блог, который объясняет это:
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.
Одно из основных различий между HashMap и Hashtable заключается в том, что HashMap не синхронизирован, а Hashtable синхронизирован, что означает, что Hashtable поточно-ориентирован и может использоваться несколькими потоками, но HashMap не может использоваться несколькими потоками без надлежащей синхронизации. Java 5 представила ConcurrentHashMap, который является альтернативой Hashtable и обеспечивает лучшую масштабируемость, чем Hashtable в Java. Синхронизированный означает, что только один поток может изменить хэш-таблицу в один момент времени. По сути, это означает, что любой поток перед выполнением обновления на хеш-таблице должен будет получить блокировку объекта, в то время как другие будут ожидать снятия блокировки.
Класс HashMap примерно эквивалентен классу Hashtable, за исключением того, что он допускает нулевые значения. (HashMap допускает нулевые значения как ключ и значение, тогда как Hashtable не допускает нулевые значения).
Третье существенное различие между HashMap и Hashtable заключается в том, что Iterator в HashMap является итератором, работающим без сбоев, а перечислитель для Hashtable - нет и создает исключение ConcurrentModificationException, если какой-либо другой поток изменяет карту структурно, добавляя или удаляя любой элемент, кроме собственного удаления Iterator ( ) метод. Но это не гарантированное поведение и будет сделано JVM с максимальной отдачей. Это также важное различие между перечислением и итератором в Java.
Еще одно заметное отличие между Hashtable и HashMap заключается в том, что из-за безопасности потоков и синхронизации Hashtable намного медленнее, чем HashMap, если используется в однопоточной среде. Поэтому, если вам не нужна синхронизация и HashMap используется только одним потоком, он выполняет Hashtable в Java.
HashMap не гарантирует, что порядок карты будет оставаться постоянным во времени.
Обратите внимание, что HashMap может быть синхронизирован
Map m = Collections.synchronizedMap(hashMap);В заключение, существуют существенные различия между Hashtable и HashMap в Java, например, потокобезопасность и скорость, и основанные на этом, используйте Hashtable только в том случае, если вам абсолютно необходима безопасность потоков, если вы используете Java 5, подумайте об использовании ConcurrentHashMap в Java.
HashMap и Hashtable оба используются для хранения данных в форме ключа и значения. Оба используют технику хеширования для хранения уникальных ключей. Но есть много различий между классами HashMap и Hashtable, которые приведены ниже.