Java Academy · Les

EnumSet en EnumMap

Gebruik EnumSet en EnumMap voor efficiënte, typeveilige collecties op basis van enums.

Les 4 van 413 stappen

EnumSet en EnumMap is een gratis Java Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.

EnumSet en EnumMap

EnumSet en EnumMap zijn sterk geoptimaliseerde implementaties van verzamelingen voor enums. Intern gebruiken ze bitvectoren — veel sneller dan HashSet/HashMap voor enumsleutels.

EnumSet: verzamelingen maken

EnumSet biedt fabrieksmethoden om verzamelingen van enumconstanten te maken.

import java.util.*;

enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }

EnumSet<Day> weekdays  = EnumSet.range(Day.MON, Day.FRI);
EnumSet<Day> weekend   = EnumSet.of(Day.SAT, Day.SUN);
EnumSet<Day> allDays   = EnumSet.allOf(Day.class);
EnumSet<Day> noDays    = EnumSet.noneOf(Day.class);

System.out.println(weekdays); // [MON, TUE, WED, THU, FRI]
System.out.println(weekend);  // [SAT, SUN]
System.out.println(allDays.size()); // 7

EnumSet: bewerkingen op verzamelingen

EnumSet ondersteunt standaardbewerkingen op verzamelingen — unie, doorsnede en complement. Dankzij de implementatie met bitvectoren zijn deze bewerkingen extreem snel.

import java.util.*;

enum Permission { READ, WRITE, DELETE, ADMIN, EXPORT }

EnumSet<Permission> userPerms  = EnumSet.of(Permission.READ, Permission.WRITE);
EnumSet<Permission> adminPerms = EnumSet.allOf(Permission.class);

// Complement
EnumSet<Permission> missing = EnumSet.complementOf(userPerms);
System.out.println("Missing: " + missing);
// Missing: [DELETE, ADMIN, EXPORT]

// Intersection (retain)
EnumSet<Permission> shared = EnumSet.copyOf(userPerms);
shared.retainAll(adminPerms);
System.out.println("Shared: " + shared); // [READ, WRITE]

EnumMap: enums aan waarden koppelen

EnumMap gebruikt intern het ordinaal van de enum als array-index — een O(1)-opzoeking die sneller is dan HashMap.

import java.util.*;

enum Quarter { Q1, Q2, Q3, Q4 }

EnumMap<Quarter, Double> revenue = new EnumMap<>(Quarter.class);
revenue.put(Quarter.Q1, 125_000.0);
revenue.put(Quarter.Q2, 148_500.0);
revenue.put(Quarter.Q3, 132_750.0);
revenue.put(Quarter.Q4, 175_200.0);

double total = revenue.values().stream()
    .mapToDouble(Double::doubleValue).sum();
System.out.printf("Annual revenue: $%.0f%n", total);
// Annual revenue: $581450

EnumMap: in volgorde itereren

EnumMap doorloopt sleutels altijd in de volgorde waarin ze in de enum zijn gedeclareerd — niet in invoegvolgorde of hashvolgorde.

import java.util.*;

enum Month { JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC }

EnumMap<Month, Integer> salesUnits = new EnumMap<>(Month.class);
salesUnits.put(Month.MAR, 1420);
salesUnits.put(Month.JAN, 980);
salesUnits.put(Month.FEB, 1105);

// Iterates JAN, FEB, MAR (declaration order, not insertion order)
for (var entry : salesUnits.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}
// JAN: 980
// FEB: 1105
// MAR: 1420

Rechtensysteem met EnumSet

Een op rollen gebaseerd rechtensysteem dat EnumSet gebruikt voor efficiënte rechtencontroles en een overzichtelijk API-ontwerp.

import java.util.*;

enum Permission { READ, WRITE, DELETE, PUBLISH, ADMIN }

record Role(String name, EnumSet<Permission> permissions) {
    boolean can(Permission p) { return permissions.contains(p); }
}

Role editor = new Role("Editor",
    EnumSet.of(Permission.READ, Permission.WRITE, Permission.PUBLISH));
Role viewer = new Role("Viewer",
    EnumSet.of(Permission.READ));

System.out.println(editor.can(Permission.WRITE));  // true
System.out.println(viewer.can(Permission.DELETE)); // false

Functievlaggen met EnumMap

EnumMap is ideaal voor systemen met functievlaggen: snelle O(1)-opzoekingen met enumsleutels.

import java.util.*;

enum Feature { DARK_MODE, BETA_EDITOR, AI_SUGGESTIONS, EXPORT_PDF }

class FeatureFlags {
    private final EnumMap<Feature, Boolean> flags = new EnumMap<>(Feature.class);

    public FeatureFlags() {
        for (Feature f : Feature.values()) flags.put(f, false);
    }

    public void enable(Feature f)  { flags.put(f, true); }
    public void disable(Feature f) { flags.put(f, false); }
    public boolean isEnabled(Feature f) { return flags.getOrDefault(f, false); }
}

FeatureFlags ff = new FeatureFlags();
ff.enable(Feature.DARK_MODE);
System.out.println(ff.isEnabled(Feature.DARK_MODE));      // true
System.out.println(ff.isEnabled(Feature.AI_SUGGESTIONS)); // false

Prestaties: EnumSet versus HashSet

EnumSet gebruikt één bitmasker van het type long (voor enums met maximaal 64 constanten) — bewerkingen zijn O(1)-bitbewerkingen. HashSet gebruikt hash-bakken — trager en met meer verwerkings- en geheugenkosten.

import java.util.*;

enum Day { MON, TUE, WED, THU, FRI, SAT, SUN }

// EnumSet: bit operations on a long value
EnumSet<Day> workDays = EnumSet.range(Day.MON, Day.FRI);

// HashSet: hash table with boxing overhead
Set<Day> hashWorkDays = new HashSet<>(Arrays.asList(
    Day.MON, Day.TUE, Day.WED, Day.THU, Day.FRI));

// Both work, but EnumSet is ~5x faster for contains/add/remove
// and uses less memory
System.out.println(workDays.contains(Day.SAT));     // false
System.out.println(workDays.contains(Day.MON));     // true

EnumMap getOrDefault en computeIfAbsent

EnumMap ondersteunt alle Map-bewerkingen, waaronder getOrDefault, computeIfAbsent en merge.

import java.util.*;

enum Category { FOOD, ELECTRONICS, CLOTHING, BOOKS }

EnumMap<Category, List<String>> catalog = new EnumMap<>(Category.class);

// computeIfAbsent creates the list on first use
catalog.computeIfAbsent(Category.BOOKS, k -> new ArrayList<>()).add("Clean Code");
catalog.computeIfAbsent(Category.BOOKS, k -> new ArrayList<>()).add("Effective Java");
catalog.computeIfAbsent(Category.ELECTRONICS, k -> new ArrayList<>()).add("Laptop");

System.out.println(catalog.get(Category.BOOKS));
// [Clean Code, Effective Java]
System.out.println(catalog.getOrDefault(Category.FOOD, List.of()));
// []

Multimap-patroon met EnumMap

Combineer EnumMap met List-waarden om een multimap met enum-sleutels te maken — een efficiënte manier om items per categorie te groeperen.

import java.util.*;
import java.util.stream.*;

enum Priority { LOW, NORMAL, HIGH, URGENT }
record Task(String name, Priority priority) {}

List<Task> tasks = List.of(
    new Task("Fix login bug", Priority.URGENT),
    new Task("Update docs",   Priority.LOW),
    new Task("Add unit tests",Priority.NORMAL),
    new Task("Deploy hotfix", Priority.URGENT)
);

// Group by priority into EnumMap
EnumMap<Priority, List<Task>> byPriority = tasks.stream()
    .collect(Collectors.groupingBy(Task::priority,
        () -> new EnumMap<>(Priority.class),
        Collectors.toList()));

byPriority.forEach((p, ts) ->
    System.out.println(p + ": " + ts.stream().map(Task::name).collect(Collectors.joining(", "))));

Wanneer gebruik je EnumSet of EnumMap

Samenvatting van wanneer je elke variant kiest:

  • EnumSet: wanneer je een verzameling enumwaarden nodig hebt — rechten, actieve functies, geselecteerde dagen
  • EnumMap: wanneer je elke enumconstante aan een waarde koppelt — configuratie per functie, score per niveau, items per categorie
  • Beide: geef bij enumsleutels de voorkeur aan deze typen boven HashSet/HashMap — ze zijn sneller, gebruiken minder geheugen en behouden de volgorde

Snelle controle

Welke interne gegevensstructuur gebruikt EnumSet voor enums met maximaal 64 constanten?

Samenvatting: EnumSet en EnumMap

Belangrijkste punten:

  • EnumSet gebruikt een bitvector — extreem snel voor kleine enumverzamelingen
  • EnumSet.of(), range(), allOf() en noneOf() zijn veelgebruikte fabrieksmethoden
  • EnumMap gebruikt arrays met indexen op basis van het ordinaal — O(1)-opzoeking, geordend volgens de declaratie
  • Gebruik EnumSet voor rechtensets, functievlaggen en filtering op dagen van de week
  • Gebruik EnumMap voor configuratie per categorie, scoretabellen en koppelingen van functies aan waarden
  • Beide behouden de volgorde van de enumdeclaratie en zijn efficiënter dan verzamelingen op basis van hashes
Gratis beginnen

Leer Java met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
104
Lessen
374

Veelgestelde vragen

Is de les “EnumSet en EnumMap” gratis?

Ja — de volledige tekst van “EnumSet en EnumMap” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.

Wat leer ik in “EnumSet en EnumMap”?

Gebruik EnumSet en EnumMap voor efficiënte, typeveilige collecties op basis van enums. Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Java Academy te beginnen?

Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.

Hoe lang duurt de les “EnumSet en EnumMap”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Java Academy?

Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Enums definiëren en gebruiken
  2. Enums met velden en methoden
  3. Switch-expressies met enums
  4. EnumSet en EnumMap
← Terug naar Java Academy