Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Справочник Java

EnumMap

Словарь, ключи которого — значения одного enum. Быстрый и хранит ключи в порядке объявления.

Доступно с: Java 5

Синтаксис

public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V>

Параметры

ПараметрТипОписание
keyTypeClass<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().

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.