EnumMap
Словарь, ключи которого — значения одного enum. Быстрый и хранит ключи в порядке объявления.
Доступно с: Java 5
Синтаксис
public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V>Параметры
| Параметр | Тип | Описание |
|---|---|---|
| keyType | Class<K> | Класс enum для ключей, например Day.class (передаётся в конструктор). |
Примеры
Ключи идут в порядке объявления констант, а не в порядке добавления:
enum Day { MON, TUE, WED }
void main() {
Map<Day, String> plan = new EnumMap<>(Day.class);
plan.put(Day.WED, "gym");
plan.put(Day.MON, "work");
IO.println(plan);
IO.println(plan.containsKey(Day.TUE));
}Результат:
{MON=work, WED=gym}
falseПодсчёт заказов по статусам через groupingBy с EnumMap:
enum Status { NEW, PAID, SHIPPED }
record Order(int id, Status status) {}
void main() {
List<Order> orders = List.of(
new Order(1, Status.PAID),
new Order(2, Status.NEW),
new Order(3, Status.PAID));
Map<Status, Long> counts = orders.stream()
.collect(Collectors.groupingBy(Order::status,
() -> new EnumMap<>(Status.class), Collectors.counting()));
IO.println(counts);
}Результат:
{NEW=1, PAID=2}Примечания
Внутри EnumMap — обычный массив, индекс которого равен ordinal() константы, поэтому он быстрее и экономнее HashMap. Ключ null запрещён (NullPointerException), значения null допустимы. Конструктору нужен класс enum, потому что из-за стирания типов коллекция иначе не узнает, какие константы возможны. Можно скопировать обычную карту: new EnumMap<>(map).
См. также
- EnumSet — Множество значений одного enum. Работает как набор битовых флагов, но с понятным кодом.
- Enum.values() — Методы каждого enum: values() — все константы, valueOf() — константа по имени, ordinal() и name() — номер и имя.
- HashMap — Словарь на основе хеш-таблицы: быстрый поиск по ключу, порядок не гарантирован.
- enum — Объявляет перечисление — тип с фиксированным набором значений.
- Collectors.groupingBy() — Сборщик, который раскладывает элементы по группам с общим ключом.
Вопросы и ответы по теме
В учебнике
- Коллекции для перечислений — EnumMap и EnumSet в Java: словарь и множество для констант enum, диапазоны и дополнения, values(), valueOf() и почему нельзя полагаться на ordinal().