middle
Для Enum есть специальный класс java.util.EnumSet — зачем он нужен
EnumSet — это высокоэффективная реализация Set, специализированная для хранения элементов одного типа Enum. Внутри она использует битовый вектор (bit vector), где каждый элемент перечисления представлен одним битом.
Преимущества перед HashSet/TreeSet:
- Все операции (add, remove, contains) за O(1) — битовые операции.
- Пакетные операции (containsAll, retainAll, addAll) работают за O(1) через побитовые AND/OR.
- Минимальное потребление памяти: для enum с <= 64 элементами используется один long (RegularEnumSet), для большего количества — массив long (JumboEnumSet).
- Порядок итерации совпадает с порядком объявления элементов в enum.
EnumSet не имеет публичного конструктора — экземпляры создаются через статические фабричные методы: EnumSet.of(), EnumSet.allOf(), EnumSet.noneOf(), EnumSet.range(), EnumSet.complementOf().
Пример
EnumSet<DayOfWeek> weekdays = EnumSet.range(DayOfWeek.MONDAY, DayOfWeek.FRIDAY);
EnumSet<DayOfWeek> weekend = EnumSet.complementOf(weekdays);
На собеседовании: объясните через битовый вектор. Главное преимущество — O(1) для всех операций, включая пакетные. Упомяните RegularEnumSet (один long) и фабричные методы.