Java Academy · Lektion

EnumSet

Hurtige set-operationer på enums

Lektion 3 af 413 trin

EnumSet er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.

Hvad er EnumSet?

EnumSet er en specialiseret Set-implementering, der kun er beregnet til enumtyper.

Internt er den en bitvektor: hver konstant svarer til én bit. Derfor er den ekstremt hurtig og hukommelseseffektiv sammenlignet med en HashSet med enumtyper.

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);
    }
}

Oprettelse med of

Fabriksmetoden EnumSet.of(...) opretter et sæt ud fra de angivne konstanter. Der findes overbelastede versioner for én til fem elementer samt en 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 og noneOf

Yderligere to fabriksmetoder:

  • allOf(Type.class) opretter et sæt, der indeholder alle konstanter.
  • noneOf(Type.class) opretter et tomt sæt, som er klar til at blive udfyldt.
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 sammenhængende konstanter

EnumSet.range(from, to) omfatter alle konstanter mellem to endepunkter, inklusive endepunkterne, i deklarationsrækkefø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 sæt med alle konstanter, der ikke findes i det angivne sæt.

Det er en hurtig måde at vende et udvalg 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);
    }
}

Mængdeoperationer

Fordi EnumSet er en rigtig Set, får du forening, snit og differens via addAll, retainAll og removeAll.

Internt udføres disse som hurtige bitvise operationer.

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);
    }
}

Test af medlemskab

contains er et enkelt bittjek, så operationen tager konstant tid og er meget hurtig.

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 flag

Før EnumSet brugte programmører int-bitflag som READ | WRITE. EnumSet erstatter dem med typesikkerhed og læsbarhed.

Du får bitfelters ydeevne uden den fejlbehæftede manuelle maskering.

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));
    }
}

Gennemløb i deklarationsrækkefølge

EnumSet gennemløber konstanterne i deres naturlige rækkefølge, som er den rækkefølge, de er deklareret i.

Det giver et forudsigeligt og stabilt gennemløb i modsætning 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) opbygger et EnumSet ud fra enhver samling af enumværdier. Brug det til at lave 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 hurtigt

For enumtyper med højst 64 konstanter bruger EnumSet et enkelt long som bitvektor. Hver operation kræver én eller to maskininstruktioner.

Foretræk altid EnumSet frem for HashSet<MyEnum> til sæt af enumværdier.

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));
    }
}

Hurtig kontrol

Test din viden om EnumSet.

Opsummering

Du har lært om EnumSet:

  • Et bitvektorbaseret Set til enumtyper, som er meget hurtigt og kompakt.
  • Fabriksmetoderne of, allOf, noneOf, range, complementOf og copyOf.
  • Det gennemløbes i deklarationsrækkefølge.
  • Den typesikre erstatning for int-bitflag.

Næste emne er den tilsvarende Map-type: 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));
    }
}
Gratis at komme i gang

Lær Java med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
104
Lektioner
374

Ofte stillede spørgsmål

Er lektionen “EnumSet” gratis?

Ja — hele teksten til “EnumSet” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “EnumSet”?

Hurtige set-operationer på enums Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Java Academy?

Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “EnumSet”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Java Academy-lektion?

Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Enums med felter og metoder
  2. Abstrakte metoder i enums
  3. EnumSet
  4. EnumMap
← Tilbage til Java Academy