Ответ
HashMap<K, V> — реализация интерфейса Map на основе хэш-таблицы. Основное назначение — предоставление очень быстрого доступа к данным по уникальному ключу (в среднем O(1) для get() и put()).
Ключевые характеристики и сценарии использования:
- Быстрый поиск по ключу: Идеально для кэшей, словарей, индексов, где частые операции — вставка и поиск.
HashMap<String, User> userCache = new HashMap<>(); userCache.put("user123", someUser); User u = userCache.get("user123"); // Мгновенный доступ по ключу - Отсутствие гарантий порядка: Элементы не упорядочены. Если важен порядок вставки, используйте
LinkedHashMap; если сортировка по ключу —TreeMap. - Допустимость
null:HashMapпозволяет иметь один ключnullи множество значенийnull. - Не потокобезопасен: Для многопоточного доступа требуется внешняя синхронизация или использование
ConcurrentHashMap.
Внутреннее устройство (упрощённо):
- При вызове
put(key, value)вычисляется хэш-код ключа (key.hashCode()). - На основе хэша определяется «корзина» (bucket), в которую помещается пара ключ-значение.
- При вызове
get(key)по тому же хэшу быстро находится нужная корзина и в ней — значение.
Важные нюансы:
- Ключи должны быть неизменяемыми (или не менять свой
hashCodeпосле добавления в карту). Для ключа-StringилиIntegerэто выполняется. - При большом количестве коллизий (когда много ключей попадает в одну корзину) производительность деградирует до O(n).
Альтернативы: Hashtable (устаревший, синхронизированный), ConcurrentHashMap (потокобезопасный), TreeMap (отсортированный), LinkedHashMap (с порядком).