В чем разница между HashMap и Hashtable в Java?
Обратите внимание, что во openjdk многих ответах указано, что openjdk Hashtable синхронизирована. На практике это мало что дает. Синхронизация core-java в методах доступа/мутатора jdk остановит одновременное добавление java или удаление двух потоков hashmap с карты, но в реальном мире java-api вам часто потребуется дополнительная hashtable синхронизация.
Очень распространена .java идиома «проверить, затем jre поставить» — т. е. найти jdk запись в Map
и добавить ее, если hashtable она еще не существует. Это j2se никоим образом не атомарная java-se операция, используете ли .java вы Hashtable
или HashMap
.
Эквивалентно синхронизированный hashtable HashMap
можно получить следующим java-libraries образом:
Collections.synchronizedMap(myMap);
Но для корректной j2se реализации этой логики нужна hashmaps дополнительная синхронизация вида:
synchronized(myMap) {
if (!myMap.containsKey("tomato"))
myMap.put("tomato", "red");
}
Даже повторение записей java-se Hashtable
(или HashMap
, полученных Collections.synchronizedMap
) не является hashmap потокобезопасным, если вы collection также не защитите Map
от изменения collection с помощью дополнительной collection синхронизации.
Реализации hashmaps интерфейса ConcurrentMap
(например, ConcurrentHashMap
) решают .java некоторые из этих проблем, включая javax потокобезопасную семантику проверки, затем действия, например:
ConcurrentMap.putIfAbsent(key, value);
java
collections
hashmap
hashtable
В чем разница между HashMap и Hashtable в Java?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.