Java Academy · leksjon

EnumSet

Raske mengdeoperasjoner på enums

Leksjon 3 av 413 trinn

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 Set for enum-typer, som er svært raskt og kompakt.
  • Fabrikkmetodene of, allOf, noneOf, range, complementOf og copyOf.
  • 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));
    }
}
Gratis å komme i gang

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.

Alle leksjonene i dette kurset

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