В чем разница между HashMap
и Hashtable
? Согласно тому, что я знаю о структурах данных, концептуально это будет то же самое, но в Java какая разница?
Что больше рекомендуется использовать в приложениях, использующих Threads
?
В чем разница между HashMap
и Hashtable
? Согласно тому, что я знаю о структурах данных, концептуально это будет то же самое, но в Java какая разница?
Что больше рекомендуется использовать в приложениях, использующих Threads
?
Синхронизация
Основное отличие одного от другого — внутренняя синхронизация объекта.
Для многопоточных приложений предпочтительнее выбирать ,
Hashtable
уHashMap
которого нет синхронизации.Однако вы должны принять во внимание, что он
HashTable
предлагает синхронизацию в методах доступа и мутации, что предотвратит одновременное добавление или удаление двух разных потоков из списка, но есть типичные операции многопоточного приложения, которые потребуют внешней синхронизации. .Распространенным случаем является check-and-add , который представляет собой не что иное, как проверку наличия ключа в списке и добавление его, если нет. Невозможно сделать это в атомарной операции с помощью
Hashtable
niHashMap
.Итерация по записям
Hashtable
также не потокобезопасна , если вы не запретите изменение списка с помощью дополнительной синхронизации:Существуют реализации интерфейса
ConcurrentMap
(напримерConcurrentHashMap
), которые решают некоторые из этих проблем, включая семантику проверки, затем действия , которая является потокобезопасной , напримерНулевые ключи или значения
Еще одно важное отличие состоит в том, что
Hashtable
он не допускает ключей или значенийnull
, в то время какHashMap
допускает ключ и любое количество значенийnull
.порядок итераций
Одним из подклассов
HashMap
являетсяLinkedHashMap
, который полезен в случае, если вам требуется предсказуемый порядок итерации (по умолчанию порядок вставки). Вы можете легко изменить свою декларацию сHashMap
наLinkedHashMap
.Типичный вопрос на собеседовании
HashTable - это немного старая структура данных, хотя все, что они говорят о синхронизации, верно и что она не допускает использование нуля в качестве ключа или значения, я думаю, стоит упомянуть, что ее иерархическая линия отличается от карты, поскольку HastTable расширяет словарь еще одна немного старомодная структура данных, в то время как HashMap расширяет AbstractMap, но оба реализуют Map.
В классе Collections (Helper Class) есть метод для создания синхронизированных карт, которые могут помочь нам заменить использование HashTables в наших программах.
Вы также можете добиться синхронизации с синхронизированным блоком
Источник: Java Doc Java - grepcode.com
Чтобы немного лучше понять, как работают эти объекты, я настоятельно рекомендую прочитать их исходный код:
Исходный код HashMap: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/HashMap.java
Исходный код HashTable: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/Hashtable.java#Hashtable
Если вы хотите использовать синхронизированную карту для многопоточного приложения, в пакете параллелизма java.util также есть этот объект, который может оказаться весьма полезным.
Между ними есть несколько различий:
Hashtable
синхронизировано,HashMap
нет. В вашем случае вы должны использовать,Hashtable
поскольку ваше приложение является многопоточным, как вы упомянули.Hashtable
не позволяетnull
в качестве ключа или значения .HashMap
он позволяет использовать только один ключ ,null
и нет никаких ограничений на его использованиеnull
для любого количества значений .Один из подклассов
HashMap
isLinkedHashMap
, поэтому, если вам нужен предсказуемый порядок при повторении, вы можете изменить егоHashMap
наLinkedHashMap
.Hashtable
у него нет подобного подкласса.