В чем разница между 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

2022-11-20T17:25:10+00:00