HashMap не синхронизирована, поэтому небезопасна в многопоточной среде без внешней синхронизации. Hashtable полностью синхронизирована — одновременно к ней может обращаться только один поток, остальные потоки должны ждать освобождения блокировки. Для современных приложений рассмотри ConcurrentHashMap как более удачную синхронизированную альтернативу.
HashMap допускает один null-ключ и множество null-значений. Hashtable не позволяет null-ключи или null-значения и бросит NullPointerException при попытке их использовать.
HashMap не гарантирует никакого конкретного порядка элементов. Однако его подкласс LinkedHashMap сохраняет порядок вставки, а TreeMap сортирует ключи по возрастанию. Hashtable тоже не даёт никаких гарантий порядка. HashMap обычно быстрее — за счёт отсутствия накладных расходов на синхронизацию.
Hashtable — это legacy-класс из Java 1.0, впоследствии адаптированный под интерфейс Map. HashMap — часть современного Collection Framework и является предпочтительным выбором для несинхронизированной работы с map.
HashMap использует fail-fast Iterator, который бросит ConcurrentModificationException, если другой поток изменит map во время итерации (кроме изменений через собственный метод remove() итератора). Это помогает выявлять ошибки при конкурентном доступе. Enumeration у Hashtable не является fail-fast и подобные проблемы не обнаружит.
Для нового кода используй HashMap в однопоточном контексте или с внешней синхронизацией, а ConcurrentHashMap — в многопоточной среде. Hashtable лучше не использовать — она считается устаревшей.
HashMap позволяет использовать null в качестве ключа и несколько null в качестве значений, в то время как Hashtable выбрасывает NullPointerException при попытке вставить null ключ или значение.
Новый — ещё не проверен сообществом
Вы