java
collections
hashmap
hashtable
dmanxiii
источник
источник
ConcurrentMap
здесь нет необходимости, так как в Вопросе говорится, что «непоточные приложения» означают, что многопоточность / параллелизм не является проблемой.Ответы:
Есть несколько различий между
HashMap
иHashtable
в Java:Hashtable
будет синхронизировано , тогда как этоHashMap
не так. ЭтоHashMap
лучше для не поточных приложений, поскольку несинхронизированные объекты обычно работают лучше, чем синхронизированные.Hashtable
не разрешаетnull
ключи или значения.HashMap
позволяет одинnull
ключ и любое количествоnull
значений.Одним из подклассов HashMap является
LinkedHashMap
, поэтому в случае, если вам нужен предсказуемый порядок итераций (по умолчанию это порядок вставки), вы можете легко поменять формулуHashMap
на aLinkedHashMap
. Это было бы не так просто, если бы вы использовалиHashtable
.Поскольку синхронизация не является проблемой для вас, я бы порекомендовал
HashMap
. Если синхронизация становится проблемой, вы также можете посмотретьConcurrentHashMap
.источник
Collections.synchronizedMap()
.Hashtable
(«синхронизация каждого метода должна решать любые проблемы с параллелизмом!») Сильно ухудшает многопоточные приложения. Вам лучше синхронизировать внешнююHashMap
(и думать о последствиях) или использоватьConcurrentMap
реализацию (и использовать ее расширенный API для параллелизма). Итог: единственная причина использованияHashtable
- это когда устаревший API (примерно с 1996 года) требует этого.Обратите внимание, что во многих ответах говорится, что Hashtable синхронизирован. На практике это очень мало тебя покупает. Синхронизация по методам доступа / мутатора остановит одновременное добавление или удаление двух потоков из карты, но в реальном мире вам часто потребуется дополнительная синхронизация.
Очень распространенная идиома - «проверить, затем положить» - то есть найти запись в
Map
и добавить ее, если она еще не существует. Это ни в коем случае не атомарная операция, используете ли выHashtable
илиHashMap
.Эквивалентно синхронизированы
HashMap
может быть получен путем:Но чтобы правильно реализовать эту логику, вам нужна дополнительная синхронизация формы:
Даже перебирая
Hashtable
записи (илиHashMap
полученныхCollections.synchronizedMap
) не является потокобезопасным, если только вы не защитите егоMap
от изменения посредством дополнительной синхронизации.Реализации
ConcurrentMap
интерфейса (напримерConcurrentHashMap
) решают некоторые из этих проблем, включая семантику проверки потока и действия потока, такую как:источник
Hashtable
считается устаревшим кодом. Ничего вHashtable
этом не может быть сделано с использованиемHashMap
или производнымиHashMap
, поэтому для нового кода я не вижу никакого оправдания возвращениюHashtable
.источник
Этот вопрос часто задают на собеседовании, чтобы проверить, понимает ли кандидат правильное использование коллекционных классов и знает ли он о доступных альтернативных решениях.
HashMap
Класс примерно соответствуетHashtable
, за исключением того, что она не синхронизирована и разрешают нули. (HashMap
допускает нулевые значения в качестве ключа и значения, тогдаHashtable
как не позволяетnull
s).HashMap
не гарантирует, что порядок карты будет оставаться постоянным во времени.HashMap
не синхронизирован, тогда какHashtable
как синхронизирован.HashMap
является отказоустойчивым, а перечислитель дляHashtable
is - нет, и 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
. Сравнение точное, понятное и простое для понимания.Java Collection Matrix
источник
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:
по сравнению со старым подходом Hashtable:
В Java 1.8 нам также обещают создавать и получать доступ к HashMaps, как в старых добрых скриптовых языках:
Обновление: нет, они не будут приземляться в 1.8 ... :(
Будут ли улучшены коллекции Project Coin в JDK8?
источник
Hashtable
синхронизирован, аHashMap
нет. Это делаетHashtable
медленнее, чемHashmap
.Для непоточных приложений используйте,
HashMap
поскольку в остальном они одинаковы по функциональности.источник
HashTable синхронизируется, если вы используете его в одном потоке, вы можете использовать HashMap , который является несинхронизированной версией. Несинхронизированные объекты часто немного более производительны. Кстати, если несколько потоков обращаются к 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
- иногда называемый контейнером - это просто объект, который группирует несколько элементов в одну единицу.Collection
s используются для хранения, извлечения, манипулирования и передачи совокупных данных. Структура коллекций W представляет собой унифицированную архитектуру для представления и управления коллекциями.И
HashMap
JDK1.2
HashtableJDK1.0
, оба используются для представления группы объектов, представленных в<Key, Value>
паре. Каждая<Key, Value>
пара называетсяEntry
объектом. Коллекция записей ссылается на объектHashMap
иHashtable
. Ключи в коллекции должны быть уникальными или отличительными. [поскольку они используются для получения сопоставленного значения определенного ключа. значения в коллекции могут быть продублированы.]« Член суперкласса, Legacy и Collection Framework
Hashtable - это устаревший класс, представленный в
JDK1.0
, который является подклассом класса Dictionary. ИзJDK1.2
Hashtable переработан, чтобы реализовать интерфейс Map, чтобы стать членом коллекции Framework. HashMap является членом Java Collection Framework с самого начала его появления вJDK1.2
. HashMap является подклассом класса AbstractMap.« Начальная емкость и коэффициент загрузки
Емкость - это количество сегментов в хэш-таблице, а начальная емкость - это просто емкость на момент создания хеш-таблицы. Обратите внимание, что хеш-таблица открыта: в случае «
hash
collision
» в одном сегменте хранится несколько записей, которые необходимо искать последовательно. Коэффициент загрузки - это мера того, насколько полной хеш-таблице разрешено получать до того, как ее емкость будет автоматически увеличена.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
является безотказным по своей природе. то есть он генерирует исключение ConcurrentModificationException, если коллекция изменяется при выполнении итерации, отличной от собственного метода remove (). Где какEnumeration
отказоустойчивый в природе. Он не выдает никаких исключений, если коллекция изменяется во время итерации.Согласно Java API Docs, Iterator всегда предпочтительнее перечисления.
НОТА: . Функциональность интерфейса перечисления дублируется интерфейсом итератора. Кроме того, Iterator добавляет необязательную операцию удаления и имеет более короткие имена методов. Новые реализации должны рассмотреть возможность использования Iterator вместо Enumeration.
В Java 5 представлен интерфейс ConcurrentMap :
ConcurrentHashMap
- высококонкурентная, высокопроизводительнаяConcurrentMap
реализация, поддерживаемая хэш-таблицей. Эта реализация никогда не блокируется при выполнении поиска и позволяет клиенту выбирать уровень параллелизма для обновлений. Он предназначен в качестве замены дляHashtable
: в дополнение к реализацииConcurrentMap
, он поддерживает все «устаревшие» методы, свойственныеHashtable
.Каждое
HashMapEntry
значение s является изменчивым обеспечивая тем самым высокую согласованность зерна для предполагаемых изменений и последующих считываний; каждое чтение отражает последнее завершенное обновлениеИтераторы и перечисления являются отказоустойчивыми - отражают состояние в некоторый момент с момента создания итератора / перечисления; это позволяет одновременно считывать и модифицировать за счет снижения согласованности. Они не бросают ConcurrentModificationException. Однако итераторы предназначены для использования только одним потоком за раз.
Как и в
Hashtable
отличиеHashMap
, этот класс не позволяет использовать null в качестве ключа или значения.« Нулевые ключи и нулевые значения
HashMap
позволяет максимум один нулевой ключ и любое количество нулевых значений. Где asHashtable
не допускает даже одного нулевого ключа и нулевого значения, если ключ или значение null, то он генерирует исключение NullPointerException.пример« Синхронизировано, Thread Safe
Hashtable
внутренне синхронизирован. Поэтому его очень безопасно использоватьHashtable
в многопоточных приложениях. Где какHashMap
не внутренне синхронизировано. Поэтому использованиеHashMap
в многопоточных приложениях без внешней синхронизации небезопасно . Вы можете внешне синхронизировать,HashMap
используяCollections.synchronizedMap()
метод.« Производительность
Поскольку
Hashtable
внутренняя синхронизация, это делаетHashtable
немного медленнее, чемHashMap
.@Видеть
HashMap
в Java 8источник
Для многопоточных приложений вы часто можете использовать ConcurrentHashMap - это зависит от ваших требований к производительности.
источник
1.
Hashmap
иHashTable
оба храните ключ и значение.2.
Hashmap
может хранить один ключ какnull
.Hashtable
не могу хранитьnull
.3.
HashMap
не синхронизируется, ноHashtable
синхронизируется.4.
HashMap
можно синхронизировать сCollection.SyncronizedMap(map)
источник
Помимо уже упомянутых различий, следует отметить, что, начиная с 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.
источник
Мой маленький вклад:
источник
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 в определенный момент времени.Пример :
HashMap:
HashMap похож на Hashtable, но он также принимает пару ключ-значение. Это позволяет null как для ключей, так и для значений. Его производительность лучше, чем лучше
HashTable
, потому что этоunsynchronized
.Пример:
источник
HashMap
эмулируется и, следовательно, может использоваться вGWT client code
то времяHashtable
как нет.источник
Старая и классическая тема, просто хочу добавить этот полезный блог, который объясняет это:
http://blog.manishchhabra.com/2012/08/the-5-main-differences-betwen-hashmap-and-hashtable/
Блог Маниша Чхабры
источник
HashMap и Hashtable оба используются для хранения данных в форме ключа и значения. Оба используют технику хеширования для хранения уникальных ключей. Но есть много различий между классами HashMap и Hashtable, которые приведены ниже.
источник