EnumSet
Schnelle Mengenoperationen für Enums
EnumSet ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist EnumSet?
EnumSet ist eine spezialisierte Set-Implementierung ausschließlich für Enum-Typen.
Intern verwendet sie einen Bitvektor: Jede Konstante entspricht einem Bit. Dadurch ist sie im Vergleich zu einem HashSet aus Enums extrem schnell und speichereffizient.
import java.util.EnumSet;
import java.util.Set;
public class Main {
enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
public static void main(String[] args) {
Set<Day> weekend = EnumSet.of(Day.SAT, Day.SUN);
System.out.println(weekend);
}
}Mit of erstellen
Die Factory-Methode EnumSet.of(...) erstellt eine Menge aus den angegebenen Konstanten. Es gibt Überladungen für ein bis fünf Elemente sowie eine Varargs-Version.
import java.util.EnumSet;
public class Main {
enum Perm { READ, WRITE, EXECUTE }
public static void main(String[] args) {
EnumSet<Perm> perms = EnumSet.of(Perm.READ, Perm.WRITE);
System.out.println(perms);
}
}allOf und noneOf
Zwei weitere Factory-Methoden:
allOf(Type.class)erstellt eine Menge, die jede Konstante enthält.noneOf(Type.class)erstellt eine leere Menge, die anschließend gefüllt werden kann.
import java.util.EnumSet;
public class Main {
enum Color { RED, GREEN, BLUE }
public static void main(String[] args) {
EnumSet<Color> all = EnumSet.allOf(Color.class);
EnumSet<Color> none = EnumSet.noneOf(Color.class);
none.add(Color.RED);
System.out.println("all: " + all);
System.out.println("built: " + none);
}
}range für zusammenhängende Konstanten
EnumSet.range(from, to) enthält alle Konstanten zwischen zwei Endpunkten einschließlich der Endpunkte in Deklarationsreihenfolge.
import java.util.EnumSet;
public class Main {
enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
public static void main(String[] args) {
EnumSet<Day> workdays = EnumSet.range(Day.MON, Day.FRI);
System.out.println(workdays);
}
}complementOf
EnumSet.complementOf(set) gibt eine Menge aller Konstanten zurück, die nicht in der angegebenen Menge enthalten sind.
Damit lässt sich eine Auswahl schnell invertieren.
import java.util.EnumSet;
public class Main {
enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }
public static void main(String[] args) {
EnumSet<Day> work = EnumSet.range(Day.MON, Day.FRI);
EnumSet<Day> rest = EnumSet.complementOf(work);
System.out.println(rest);
}
}Mengenoperationen
Da EnumSet ein echtes Set ist, erhalten Sie Vereinigungs-, Schnitt- und Differenzmengen über addAll, retainAll und removeAll.
Intern werden diese als ebenso schnelle bitweise Operationen ausgeführt.
import java.util.EnumSet;
public class Main {
enum Tag { A, B, C, D }
public static void main(String[] args) {
EnumSet<Tag> x = EnumSet.of(Tag.A, Tag.B, Tag.C);
EnumSet<Tag> y = EnumSet.of(Tag.B, Tag.C, Tag.D);
EnumSet<Tag> inter = EnumSet.copyOf(x);
inter.retainAll(y);
System.out.println("intersection: " + inter);
}
}Zugehörigkeitsprüfungen
contains prüft nur ein einzelnes Bit, daher läuft die Prüfung in konstanter Zeit und ist sehr schnell.
import java.util.EnumSet;
public class Main {
enum Feature { DARK_MODE, BETA, ANALYTICS }
public static void main(String[] args) {
EnumSet<Feature> enabled = EnumSet.of(Feature.DARK_MODE, Feature.BETA);
System.out.println(enabled.contains(Feature.BETA));
System.out.println(enabled.contains(Feature.ANALYTICS));
}
}EnumSet als Ersatz für Flags
Vor EnumSet verwendeten Programmierer int-Bitflags wie READ | WRITE. EnumSet ersetzt dies durch Typsicherheit und bessere Lesbarkeit.
Sie erhalten die Performance von Bitfeldern ohne das fehleranfällige manuelle Maskieren.
import java.util.EnumSet;
import java.util.Set;
public class Main {
enum Style { BOLD, ITALIC, UNDERLINE }
static void render(Set<Style> styles) {
System.out.println("Applying: " + styles);
}
public static void main(String[] args) {
render(EnumSet.of(Style.BOLD, Style.UNDERLINE));
}
}Iteration in Deklarationsreihenfolge
EnumSet durchläuft die Konstanten in ihrer natürlichen Reihenfolge, also in der Reihenfolge ihrer Deklaration.
Dadurch ist die Iteration vorhersehbar und stabil, anders als bei HashSet.
import java.util.EnumSet;
public class Main {
enum Phase { ALPHA, BETA, RC, GA }
public static void main(String[] args) {
EnumSet<Phase> set = EnumSet.of(Phase.GA, Phase.ALPHA, Phase.RC);
for (Phase p : set) System.out.println(p);
}
}Defensive Kopien mit copyOf
EnumSet.copyOf(collection) erstellt aus einer beliebigen Collection von Enum-Werten ein EnumSet. Verwenden Sie es, um eine sichere Kopie zu erstellen oder eine List zu konvertieren.
import java.util.EnumSet;
import java.util.List;
public class Main {
enum Role { ADMIN, EDITOR, VIEWER }
public static void main(String[] args) {
List<Role> source = List.of(Role.EDITOR, Role.VIEWER);
EnumSet<Role> roles = EnumSet.copyOf(source);
System.out.println(roles);
}
}Warum es schnell ist
Für Enums mit höchstens 64 Konstanten verwendet EnumSet einen einzigen long als Bitvektor. Jede Operation besteht aus einer oder zwei Maschineninstruktionen.
Verwenden Sie für Enum-Mengen immer EnumSet statt HashSet<MyEnum>.
import java.util.EnumSet;
public class Main {
enum Bit { B0, B1, B2, B3 }
public static void main(String[] args) {
EnumSet<Bit> s = EnumSet.of(Bit.B0, Bit.B2);
// contains is a single bit-and under the hood
System.out.println(s.contains(Bit.B2));
}
}Kurzer Test
Testen Sie Ihr Wissen über EnumSet.
Zusammenfassung
Sie haben EnumSet gelernt:
- Ein sehr schnelles und kompaktes, bitvektorbasiertes
Setfür Enums. - Factory-Methoden:
of,allOf,noneOf,range,complementOf,copyOf. - Die Iteration erfolgt in Deklarationsreihenfolge.
- Der typsichere Ersatz für int-Bitflags.
Als Nächstes geht es um den passenden Map-Typ: EnumMap.
import java.util.EnumSet;
public class Main {
enum X { A, B }
public static void main(String[] args) {
System.out.println("EnumSet recap: " + EnumSet.allOf(X.class));
}
}Häufig gestellte Fragen
Ist die Lektion „EnumSet“ kostenlos?
Ja — der vollständige Text von „EnumSet“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „EnumSet“?
Schnelle Mengenoperationen für Enums Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Java Academy zu starten?
Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „EnumSet“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?
Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.