EnumMap, преимущества и особенности
EnumMap — это специализированная реализация интерфейса Map, предназначенная для использования с перечислениями (enum) в качестве ключей. Она отличается высокой производительностью и эффективностью использования памяти по сравнению с другими реализациями Map.
Основные характеристики EnumMap
Ключи — только перечисления:
Ключами в EnumMap могут быть только перечисления (enum). Это означает, что EnumMap предназначена исключительно для использования с типами enum.
Эффективное использование памяти:
EnumMap реализована как массив, что позволяет ей быть более компактной и эффективной по сравнению с другими реализациями Map.
Высокая производительность:
Операции вставки, поиска и удаления имеют постоянное время выполнения (O(1)), что делает EnumMap очень быстрой.
Порядок ключей:
EnumMap хранит ключи в порядке их естественного порядка, определенного в перечислении.
Примеры использования EnumMap
Определение перечисления
Создание EnumMap
С использованием пустого конструктора:
С использованием другой карты:
Основные методы EnumMap
Метод put:
Метод get:
Метод remove:
Метод containsKey:
Метод size:
Метод clear:
Преимущества использования EnumMap
Производительность:
EnumMap реализована на основе массива, что делает доступ к элементам очень быстрым. Операции вставки, удаления и поиска имеют время выполнения O(1).
Эффективность использования памяти:
Поскольку EnumMap использует массив для хранения значений, она значительно экономит память по сравнению с другими реализациями Map, такими как HashMap.
Безопасность типов:
EnumMap использует перечисления в качестве ключей, что гарантирует безопасность типов и предотвращает ошибки, связанные с использованием неверных ключей.
Упорядоченность:
Ключи в EnumMap всегда упорядочены в порядке их определения в перечислении, что упрощает их использование и предсказуемость.
Ссылки на полезные статьи (спасибо авторам за проделанную работу) :
https://www.baeldung.com/java-enum-map
https://medium.com/@javatechie/java-enummap-e78c7cf0acbf
#Java #Training #Medium #EnumMap
EnumMap — это специализированная реализация интерфейса Map, предназначенная для использования с перечислениями (enum) в качестве ключей. Она отличается высокой производительностью и эффективностью использования памяти по сравнению с другими реализациями Map.
Основные характеристики EnumMap
Ключи — только перечисления:
Ключами в EnumMap могут быть только перечисления (enum). Это означает, что EnumMap предназначена исключительно для использования с типами enum.
Эффективное использование памяти:
EnumMap реализована как массив, что позволяет ей быть более компактной и эффективной по сравнению с другими реализациями Map.
Высокая производительность:
Операции вставки, поиска и удаления имеют постоянное время выполнения (O(1)), что делает EnumMap очень быстрой.
Порядок ключей:
EnumMap хранит ключи в порядке их естественного порядка, определенного в перечислении.
Примеры использования EnumMap
Определение перечисления
enum Color {
RED, GREEN, BLUE;
}
Создание EnumMap
С использованием пустого конструктора:
EnumMap<Color, String> colorMap = new EnumMap<>(Color.class);
С использованием другой карты:
Map<Color, String> anotherMap = new HashMap<>();
anotherMap.put(Color.RED, "Red Color");
anotherMap.put(Color.GREEN, "Green Color");
EnumMap<Color, String> colorMap = new EnumMap<>(anotherMap);
Основные методы EnumMap
Метод put:
colorMap.put(Color.RED, "Red Color");
colorMap.put(Color.GREEN, "Green Color");
System.out.println(colorMap); // {RED=Red Color, GREEN=Green Color}
Метод get:
String color = colorMap.get(Color.RED);
System.out.println("Color for RED: " + color); // Color for RED: Red Color
Метод remove:
String removedColor = colorMap.remove(Color.GREEN);
System.out.println("Removed color: " + removedColor); // Removed color: Green Color
System.out.println(colorMap); // {RED=Red Color}
Метод containsKey:
boolean containsRed = colorMap.containsKey(Color.RED);
System.out.println("Contains RED: " + containsRed); // Contains RED: true
Метод size:
int size = colorMap.size();
System.out.println("Size of the map: " + size); // Size of the map: 1
Метод clear:
colorMap.clear();
System.out.println("Size after clear: " + colorMap.size()); // Size after clear: 0
Преимущества использования EnumMap
Производительность:
EnumMap реализована на основе массива, что делает доступ к элементам очень быстрым. Операции вставки, удаления и поиска имеют время выполнения O(1).
Эффективность использования памяти:
Поскольку EnumMap использует массив для хранения значений, она значительно экономит память по сравнению с другими реализациями Map, такими как HashMap.
Безопасность типов:
EnumMap использует перечисления в качестве ключей, что гарантирует безопасность типов и предотвращает ошибки, связанные с использованием неверных ключей.
Упорядоченность:
Ключи в EnumMap всегда упорядочены в порядке их определения в перечислении, что упрощает их использование и предсказуемость.
Ссылки на полезные статьи (спасибо авторам за проделанную работу) :
https://www.baeldung.com/java-enum-map
https://medium.com/@javatechie/java-enummap-e78c7cf0acbf
#Java #Training #Medium #EnumMap
Baeldung
A Guide to EnumMap | Baeldung
Learn why if you aren't yet using EnumMap, you should be.
Внутренняя структура EnumMap
EnumMap состоит из двух основных массивов: один для ключей и один для значений.
Массив ключей (keyUniverse):
Это массив всех возможных значений перечисления в том порядке, в котором они объявлены. Он создается один раз и используется для быстрого поиска индексов ключей.
keyUniverse инициализируется следующим образом:
Здесь keyType — это класс перечисления, переданный в конструктор EnumMap.
Массив значений (values):
Это массив значений, который соответствует ключам. Индекс значения в этом массиве соответствует индексу ключа в массиве keyUniverse.
Инициализация массива values:
Изначально все элементы массива values равны null.
Примеры использования EnumMap
Пример 1: Карта настроек цветов
Пример 2: Использование EnumMap в качестве счетчика
#Java #Training #Medium #EnumMap
EnumMap состоит из двух основных массивов: один для ключей и один для значений.
Массив ключей (keyUniverse):
Это массив всех возможных значений перечисления в том порядке, в котором они объявлены. Он создается один раз и используется для быстрого поиска индексов ключей.
private final Enum<?>[] keyUniverse;
keyUniverse инициализируется следующим образом:
keyUniverse = keyType.getEnumConstants();
Здесь keyType — это класс перечисления, переданный в конструктор EnumMap.
Массив значений (values):
Это массив значений, который соответствует ключам. Индекс значения в этом массиве соответствует индексу ключа в массиве keyUniverse.
private transient Object[] values;
Инициализация массива values:
values = new Object[keyUniverse.length];
Изначально все элементы массива values равны null.
Примеры использования EnumMap
Пример 1: Карта настроек цветов
enum Color {
RED, GREEN, BLUE;
}
public class EnumMapExample {
public static void main(String[] args) {
EnumMap<Color, String> colorMap = new EnumMap<>(Color.class);
colorMap.put(Color.RED, "Red Color");
colorMap.put(Color.GREEN, "Green Color");
colorMap.put(Color.BLUE, "Blue Color");
for (Color color : colorMap.keySet()) {
System.out.println(color + ": " + colorMap.get(color));
}
}
}
Пример 2: Использование EnumMap в качестве счетчика
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
public class EnumMapCounter {
public static void main(String[] args) {
EnumMap<Day, Integer> dayCount = new EnumMap<>(Day.class);
// Инициализация счетчика для каждого дня недели
for (Day day : Day.values()) {
dayCount.put(day, 0);
}
// Увеличиваем счетчики для некоторых дней
dayCount.put(Day.MONDAY, dayCount.get(Day.MONDAY) + 1);
dayCount.put(Day.FRIDAY, dayCount.get(Day.FRIDAY) + 2);
dayCount.put(Day.SUNDAY, dayCount.get(Day.SUNDAY) + 3);
// Выводим результаты
for (Day day : dayCount.keySet()) {
System.out.println(day + ": " + dayCount.get(day));
}
}
}
#Java #Training #Medium #EnumMap