Подробно изучите создание и работу с Java EnumMap, узнайте, чем он отличается от HashMap, а также о практических вариантах его использования.
1. Введение в Java EnumMap
EnumMap — это специализированная реализация Map, которая использует ключи как тип enum. Когда создается карта, все ключи карты должны происходить из одного типа enum, явно или неявно.
enum Direction {EAST, WEST, NORTH, SOUTH}EnumMap<Direction, Boolean> allowedDirectionsMap = new EnumMap<>(Direction.class);allowedDirectionsMap.put(Direction.EAST, true);
Класс EnumMap(присутствует в пакете java.util) расширяет класс AbstractMap и присутствует с версии Java 1.5.
- Этот класс использует тип enum в качестве своего ключа, и все ключи экземпляра EnumMap должны иметь один тип enum.
- Все элементы в EnumMap упорядочены в естественном порядке ключей карты(порядок, в котором константы перечисления объявляются внутри типа перечисления).
- Это не потокобезопасный класс. Используйте Collections.synchronizedMap(), чтобы получить потокобезопасную ссылку на этот класс.
- Его итераторы не выдают исключение ConcurrentModificationException при попытке изменить карту во время итерации.
ВJava Collections класс объявлен следующим образом:
public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V> implements Serializable, Cloneable

2. Работа с EnumMap
2.1 Создание EnumMap
Мы можем создать EnumMap, используя следующие конструкторы:
- EnumMap(Class keyType): используется для создания пустой карты с указанным keyType.
- EnumMap(EnumMap m): используется для создания карты с тем же типом ключа, что и указанная карта Enum.
- EnumMap(Map m): используется для создания Enum Map, инициализированной из указанной карты.
EnumMap<Direction, Boolean> allowedDirectionsMap = new EnumMap<>(Direction.class);EnumMap<Direction, Boolean> newMap = new EnumMap<>(allowedDirectionsMap);EnumMap<Direction, Boolean> newMapFromAnotherMap = new EnumMap<>(Map.of(EAST, true));
2.2 Методы EnumMap
EnumMap поддерживает все стандартные методы, доступные в интерфейсе Map.
- Объект put(key, value): вставляет пару ключ-значение в карту.
- Object get(key): возвращает значение для указанного ключа в карте.
- boolean containsKey(key): возвращает значение true или false в зависимости от того, найден ли указанный ключ в карте или нет.
- boolean containsValue(value): аналогично методу containsKey(), он ищет указанное значение вместо ключа.
- Set keySet(): возвращает набор всех ключей, хранящихся в карте.
- Set entrySet(): возвращает набор всех сопоставлений, сохраненных в карте.
- Value remove(Object key): удаляет пару ключ-значение для указанного ключа.
- int size(): возвращает размер карты, равный количеству пар ключ-значение, хранящихся в карте.
public enum Planet{MERCURY, VENUS, EARTH, MARS, JUPITER}// Creating EnumMapEnumMap<Planet, String> map = new EnumMap<>(Planet.class);// Putting elements in mapmap.put(Planet.MERCURY, “Closest Planet to Sun”);map.put(Planet.JUPITER, “Largest Planet”);map.put(Planet.VENUS, “Hottest Planet”);System.out.println(map); // {MERCURY=Closest Planet to Sun, VENUS=Hottest Planet, JUPITER=Largest Planet}// Getting a value from the mapSystem.out.println(map.get(Planet.VENUS)); // Hottest Planet// Checking if a key or value present in the mapSystem.out.println(map.containsKey(Planet.JUPITER)); // trueSystem.out.println(map.containsValue(“Red Planet”)); // false// Removing an entrymap.remove(Planet.MERCURY);// Finding map sizeSystem.out.println(map.size()); // 2// Iterating over the mapfor(Map.Entry<Planet, String> entry : map.entrySet()){System.out.println(entry.getKey() + " :: " + entry.getValue());}
3. Разница между Java EnumMap и HashMap
3.1 Создание
- В EnumMap разрешены только ключи типа enum. Также нам необходимо указать тип ключа в конструкторе при создании карты.
- В HashMap разрешены все типы ключей, включая перечисления.
// EnumMap CreationEnumMap<Planet, String> enumMap = new EnumMap<>(Planet.class);// HashMap CreationHashMap<String, String> hashMap = new HashMap<>();
3.2.НУЛЬ-ключи
- EnumMap не допускает нулевых ключей, но поддерживает любое количество нулевых значений. Он выдает исключение NullPointerException во время выполнения.
- HashMap поддерживает один нулевой ключ и любое количество нулевых значений.
EnumMap<Planet, String> map = new EnumMap<>(Planet.class);map.put(null, "value1"); //NullPointerException in runtime
3.3 Внутренние реализации
EnumMap использует массивы внутри себя, тогда как HashMap использует HashTable и основан на технике хеширования.
3.4.Упорядочивание элементов
- Элементы в EnumMap упорядочены в естественном порядке ключей, в том порядке, в котором ключи/константы объявлены в типе перечисления.
- HashMap не поддерживает какой-либо порядок своих ключей, поэтому мы не можем гарантировать, что элемент, вставленный первым в карту, будет извлечен первым во время итерации.
3.5.Производительность
EnumMap работает лучше по сравнению с HashMap по следующим причинам:
- EnumMap внутренне поддерживается массивом и использует метод ordinal() при вставке элементов в карту с помощью метода put(), что исключает вероятность коллизий хэшей, что очень распространено в случае HashMap, который использует метод hashCode() для вставки элементов.
- В EnumMap ключи известны заранее, поскольку он использует константы enum в качестве своего ключа. Благодаря этому он выигрывает от дополнительной оптимизации производительности по сравнению с HashMap.
4. Заключение
Мы узнали о Enum Map в Java, его конструкторах, основных методах и чем он отличается от HashMap. Мы также рассмотрели практические примеры для того же самого и то, как мы можем создать его из других карт.