Java Academy · Lektion

EnumSet

Snabba mängdoperationer på enumvärden.

Lektion 3 av 413 steg

EnumSet är en gratis lektion i Java Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Java Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Java Academy innehåller totalt 4 lektioner.

Vad är EnumSet?

EnumSet är en specialiserad Set-implementation som endast är avsedd för enumtyper.

Internt är den en bitvektor: varje konstant motsvarar en bit. Därför är den extremt snabb och minnessnål jämfört 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);
    }
}

Skapa med of

Fabriksmetoden EnumSet.of(...) skapar en mängd utifrån de angivna konstanterna. Det finns överlagrade versioner för ett till fem element 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 och noneOf

Två ytterligare fabriksmetoder:

  • allOf(Type.class) skapar en mängd som innehåller alla konstanter.
  • noneOf(Type.class) skapar en tom mängd som kan fyllas på.
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 sammanhängande konstanter

EnumSet.range(from, to) inkluderar alla konstanter mellan två ändpunkter, inklusive ändpunkterna, i deklarationsordning.

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) returnerar en mängd med alla konstanter som inte finns i den angivna mängden.

Detta är ett snabbt sätt att invertera ett urval.

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ängdoperationer

Eftersom EnumSet är en riktig Set får du union, snitt och differens via addAll, retainAll och removeAll.

Dessa utförs som snabba bitvisa operationer under huven.

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 är en enda bitkontroll, så den har konstant tidskomplexitet och är mycket snabb.

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 ersättning för flaggor

Före EnumSet använde programmerare int-bitflaggor som READ | WRITE. EnumSet ersätter detta med typsäkerhet och läsbarhet.

Du får bitfältens prestanda utan den felbenägna manuella maskningen.

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

Iterering i deklarationsordning

EnumSet itererar i konstanternas naturliga ordning, vilket är deras deklarationsordning.

Det ger en förutsägbar och stabil iterering, till skillnad från 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);
    }
}

Skyddande kopior med copyOf

EnumSet.copyOf(collection) bygger en EnumSet från valfri samling av enumvärden. Använd den för att skapa en säker kopia eller konvertera 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);
    }
}

Varför det är snabbt

För enumtyper med högst 64 konstanter använder EnumSet en enda long som bitvektor. Varje operation består av en eller två maskininstruktioner.

Föredra alltid EnumSet framför HashSet<MyEnum> för mängder av enumtyper.

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

Snabbtest

Testa dina kunskaper om EnumSet.

Sammanfattning

Du har lärt dig om EnumSet:

  • En bitvektorbaserad Set för enumtyper, mycket snabb och kompakt.
  • Fabriksmetoderna of, allOf, noneOf, range, complementOf och copyOf.
  • Itererar i deklarationsordning.
  • Den typsäkra ersättningen för int-bitflaggor.

Därefter den motsvarande 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));
    }
}
Gratis att börja

Lär dig Java med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
104
Lektioner
374

Vanliga frågor

Är lektionen ”EnumSet” gratis?

Ja – hela texten till ”EnumSet” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Java Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Java Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”EnumSet”?

Snabba mängdoperationer på enumvärden. Ni övar på Java Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Java Academy?

Du behöver inga förkunskaper. Utbildningen i Java Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”EnumSet”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Java Academy-lektionen?

Ja. Varje Java Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Enum med fält och metoder
  2. Abstrakta metoder i enumtyper
  3. EnumSet
  4. EnumMap
← Tillbaka till Java Academy