EnumSet
Raske mengdeoperasjoner på enums
EnumSet er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.
Hva er EnumSet?
EnumSet er en spesialisert Set-implementasjon som bare kan brukes med enum-typer.
Internt er den en bitvektor: Hver konstant tilsvarer én bit. Dette gjør den svært rask og minneeffektiv sammenlignet med en HashSet med enum-verdier.
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);
}
}Opprette med of
Fabrikkmetoden EnumSet.of(...) oppretter et set fra de oppgitte konstantene. Det finnes overlagringer for én til fem elementer, samt en varargs-versjon.
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 og noneOf
To andre fabrikkmetoder:
allOf(Type.class)oppretter et set som inneholder alle konstantene.noneOf(Type.class)oppretter et tomt set som er klart til å fylles.
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 for sammenhengende konstanter
EnumSet.range(from, to) inkluderer alle konstanter mellom to endepunkter, inklusive endepunktene, i deklarasjonsrekkefølge.
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) returnerer et set med alle konstanter som ikke finnes i det angitte settet.
Dette er en rask måte å invertere et utvalg på.
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);
}
}Set-operasjoner
Fordi EnumSet er et ekte Set, får De union, snitt og differanse via addAll, retainAll og removeAll.
Internt utføres disse som svært raske bitvise operasjoner.
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);
}
}Medlemskapstester
contains er én enkelt bitsjekk, så operasjonen har konstant kjøretid og er svært rask.
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 som erstatning for bitflagg
Før EnumSet brukte programmerere int-bitflagg som READ | WRITE. EnumSet erstatter dette med typesikkerhet og bedre lesbarhet.
De får ytelsen til bitfelt uten den feilutsatte manuelle maskeringen.
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));
}
}Iterasjon i deklarasjonsrekkefølge
EnumSet itererer i konstantenes naturlige rekkefølge, som er deklarasjonsrekkefølgen.
Dette gir forutsigbar og stabil iterasjon, i motsetning til 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 kopier med copyOf
EnumSet.copyOf(collection) bygger et EnumSet fra enhver samling av enum-verdier. Bruk den til å lage en sikker kopi eller konvertere en List.
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);
}
}Hvorfor det er raskt
For enum-typer med 64 eller færre konstanter bruker EnumSet én enkelt long som bitvektor. Hver operasjon består av én eller to maskininstruksjoner.
Foretrekk alltid EnumSet fremfor HashSet<MyEnum> for enum-sett.
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));
}
}Kort sjekk
Test kunnskapene Deres om EnumSet.
Oppsummering
De har lært om EnumSet:
- Et bitvektorbasert
Setfor enum-typer, som er svært raskt og kompakt. - Fabrikkmetodene
of,allOf,noneOf,range,complementOfogcopyOf. - Iterasjon i deklarasjonsrekkefølge.
- Den typesikre erstatningen for int-bitflagg.
Deretter ser vi på den tilsvarende map-typen: 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));
}
}Lær deg Java med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 104
- Leksjoner
- 374
Ofte stilte spørsmål
Er leksjonen «EnumSet» gratis?
Ja – hele teksten i «EnumSet» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «EnumSet»?
Raske mengdeoperasjoner på enums Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Java Academy?
Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.
Hvor lang tid tar leksjonen «EnumSet»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?
Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.