Освоение Java EnumMap: эффективное отображение ключ-значение с перечислениями
Java EnumMap
В этом руководстве мы изучим класс Java EnumMap и его операции с помощью примеров.
Класс EnumMap из Java Collections Framework предоставляет реализацию карты для элементов перечисления (enum).
В EnumMap элементы enum используются как ключи. Он реализует интерфейс Map.
Создание EnumMap
Для создания enum-карты сначала импортируйте пакет java.util.EnumMap. После импорта пакета, вот как можно создавать enum-карты в Java.
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
В приведённом примере мы создали enum-карту с именем sizes.
Здесь:
- Size — ключи enum, отображающиеся на значения
- Integer — значения enum-карты, ассоциированные с соответствующими ключами
Методы EnumMap
Класс EnumMap предоставляет методы, позволяющие выполнять различные операции над enum-картами.
Вставка элементов в EnumMap
put()— вставляет указанное отображение ключ/значение (запись) в enum-картуputAll()— вставляет все записи указанной карты в эту карту
Например:
import java.util.EnumMap;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
// Создание EnumMap для enum Size
EnumMap<Size, Integer> sizes1 = new EnumMap<>(Size.class);
// Использование метода put()
sizes1.put(Size.SMALL, 28);
sizes1.put(Size.MEDIUM, 32);
System.out.println("EnumMap1: " + sizes1);
EnumMap<Size, Integer> sizes2 = new EnumMap<>(Size.class);
// Использование метода putAll()
sizes2.putAll(sizes1);
sizes2.put(Size.LARGE, 36);
System.out.println("EnumMap2: " + sizes2);
}
}
Вывод
EnumMap1: {SMALL=28, MEDIUM=32} EnumMap2: {SMALL=28, MEDIUM=32, LARGE=36}
В примере мы использовали метод putAll() для вставки всех элементов enum-карты sizes1 в enum-карту sizes2.
Также возможно вставлять элементы из других карт, таких как HashMap, TreeMap и т.д., в enum-карту с помощью putAll(). Однако все карты должны быть одного и того же enum-типа.
Доступ к элементам EnumMap
1. Использование entrySet(), keySet() и values()
entrySet()— возвращает набор всех отображений ключ/значение (записей) enum-картыkeySet()— возвращает набор всех ключей enum-картыvalues()— возвращает набор всех значений enum-карты
Например:
import java.util.EnumMap;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
// Создание EnumMap для enum Size
EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
sizes.put(Size.SMALL, 28);
sizes.put(Size.MEDIUM, 32);
sizes.put(Size.LARGE, 36);
sizes.put(Size.EXTRALARGE, 40);
System.out.println("EnumMap: " + sizes);
// Использование метода entrySet()
System.out.println("Key/Value mappings: " + sizes.entrySet());
// Использование метода keySet()
System.out.println("Keys: " + sizes.keySet());
// Использование метода values()
System.out.println("Values: " + sizes.values());
}
}
Вывод
EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40} Key/Value mappings: [SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40] Keys: [SMALL, MEDIUM, LARGE, EXTRALARGE] Values: [28, 32, 36, 40]
2. Использование метода get()
Метод get() возвращает значение, ассоциированное с указанным ключом. Возвращает null, если указанный ключ не найден.
Например:
import java.util.EnumMap;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
// Создание EnumMap для enum Size
EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
sizes.put(Size.SMALL, 28);
sizes.put(Size.MEDIUM, 32);
sizes.put(Size.LARGE, 36);
sizes.put(Size.EXTRALARGE, 40);
System.out.println("EnumMap: " + sizes);
// Использование метода get()
int value = sizes.get(Size.MEDIUM);
System.out.println("Value of MEDIUM: " + value);
}
}
Вывод
EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40} Value of MEDIUM: 32
Удаление элементов EnumMap
remove(key)— возвращает и удаляет запись, ассоциированную с указанным ключомremove(key, value)— удаляет запись из карты только если указанный ключ отображал указанное значение и возвращает boolean
Например:
import java.util.EnumMap;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
// Создание EnumMap для enum Size
EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
sizes.put(Size.SMALL, 28);
sizes.put(Size.MEDIUM, 32);
sizes.put(Size.LARGE, 36);
sizes.put(Size.EXTRALARGE, 40);
System.out.println("EnumMap: " + sizes);
// Использование метода remove()
int value = sizes.remove(Size.MEDIUM);
System.out.println("Removed Value: " + value);
boolean result = sizes.remove(Size.SMALL, 28);
System.out.println("Is the entry {SMALL=28} removed? " + result);
System.out.println("Updated EnumMap: " + sizes);
}
}
Вывод
EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40} Removed Value: 32 Is the entry {SMALL=28} removed? True Updated EnumMap: {LARGE=36, EXTRALARGE=40}
Замена элементов EnumMap
replace(key, value)— заменяет значение, ассоциированное с указанным key, на новый valuereplace(key, old, new)— заменяет old значение на new только если old значение уже ассоциировано с указанным keyreplaceAll(function)— заменяет каждое значение карты результатом указанной function
import java.util.EnumMap;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
// Создание EnumMap для enum Size
EnumMap<Size, Integer> sizes = new EnumMap<>(Size.class);
sizes.put(Size.SMALL, 28);
sizes.put(Size.MEDIUM, 32);
sizes.put(Size.LARGE, 36);
sizes.put(Size.EXTRALARGE, 40);
System.out.println("EnumMap: " + sizes);
// Использование метода replace()
sizes.replace(Size.MEDIUM, 30);
sizes.replace(Size.LARGE, 36, 34);
System.out.println("EnumMap using replace(): " + sizes);
// Использование метода replaceAll()
sizes.replaceAll((key, oldValue) -> oldValue + 3);
System.out.println("EnumMap using replaceAll(): " + sizes);
}
}
Вывод
EnumMap: {SMALL=28, MEDIUM=32, LARGE=36, EXTRALARGE=40} EnumMap using replace(): {SMALL=28, MEDIUM=30, LARGE=34, EXTRALARGE=40} EnumMap using replaceAll(): {SMALL=31, MEDIUM=33, LARGE=37, EXTRALARGE=43}
В приведённой программе обратите внимание на инструкцию
sizes.replaceAll((key, oldValue) -> oldValue + 3);
Здесь метод обращается ко всем записям карты. Затем он заменяет все значения на новые, предоставленные лямбда-выражением.
Другие методы
| Метод | Описание |
|---|---|
clone() | Создаёт копию EnumMap |
containsKey() | Ищет в EnumMap указанный ключ и возвращает boolean |
containsValue() | Ищет в EnumMap указанное значение и возвращает boolean |
size() | Возвращает размер EnumMap |
clear() | Удаляет все записи из EnumMap |
EnumSet против EnumMap
И EnumSet, и класс EnumMap предоставляют структуры данных для хранения значений enum. Однако между ними существуют существенные различия.
- Enum set представлен внутренне как последовательность бит, тогда как enum map представлен внутренне как массивы.
- Enum set создаётся с помощью предопределённых методов вроде
allOf(),noneOf(),of()и т.д. Однако enum map создаётся через свой конструктор.
Интерфейсы Cloneable и Serializable
Класс EnumMap также реализует интерфейсы Cloneable и Serializable.
Cloneable Interface
Он позволяет классу EnumMap создавать копии экземпляров класса.
Serializable Interface
Всякий раз, когда Java-объекты нужно передать по сети, объекты должны быть преобразованы в биты или байты. Это потому, что Java-объекты не могут передаваться по сети напрямую.
Интерфейс Serializable позволяет классам быть сериализованными. Это означает, что объекты классов, реализующих Serializable, могут быть преобразованы в биты или байты.
java
- Перечисления в C: определение, объявление и операции с флагами
- Освоение операторов Java: типы, синтаксис и практические примеры
- Комментарии в Java: типы, использование и лучшие практики
- Освоение улучшенного цикла for в Java: синтаксис, примеры и лучшие практики
- Освоение строк в Java: создание, методы и лучшие практики
- Интерфейсы в Java: концепции, реализация и лучшие практики
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Перечисления (Enums) в Java: полное руководство по enum и enum-классам
- Конструкторы в Java Enums: объяснение с практическим примером
- Строковые представления в Java Enums: настройка toString() и лучшие практики