Когда выбрать EnumMap вместо HashMapВ стандартной библиотеке Java есть множество реализаций Map, но когда в качестве ключей используются значения перечислений (enum), оптимальным выбором будет именно EnumMap.
Логика выбора коллекции HashMap — универсальный ключ-значение, хранит что угодно, но тратит память на hashCode.
TreeMap — ключи в отсортированном порядке, но медленнее.
LinkedHashMap — хранит порядок вставки.
EnumMap — заточен под enum-ключи, самый быстрый и компактный для этого случая.
Почему EnumMap крут Использует массив под капотом, а не хеш-таблицу — значит, lookup работает за O(1) без вычисления хэшей.
Очень экономен по памяти (не хранит объекты Map.Entry).
Гарантированно хранит ключи в порядке объявления enum-констант.
Примерenum Status { NEW, IN_PROGRESS, DONE }
EnumMap
map = new EnumMap<>(Status.class);
map.put(Status.NEW, "Создан");
map.put(Status.IN_PROGRESS, "В работе");
map.put(Status.DONE, "Завершён");
for (var entry : map.entrySet()) {
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
Когда использовать
— Ключи всегда являются значениями одного enum.
— Важен быстрый доступ к элементам и сохранение порядка ключей.
— Необходимо минимизировать использование памяти.
Когда не подходит
— Ключи не являются enum.
— Требуется поддержка null в качестве ключа.
Расскажите про боевой кейс использования в комментах.
Библиотека джависта
#буст