Java Academy · Pelajaran

EnumSet dan EnumMap

Gunakan EnumSet dan EnumMap untuk koleksi berasaskan enum yang cekap dan selamat dari segi jenis.

Pelajaran 4 daripada 413 langkah

EnumSet dan EnumMap ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

EnumSet dan EnumMap

EnumSet dan EnumMap ialah pelaksanaan koleksi untuk enum yang sangat dioptimumkan. Secara dalaman, kedua-duanya menggunakan vektor bit — jauh lebih pantas daripada HashSet/HashMap untuk kunci enum.

EnumSet: Mencipta Set

EnumSet menyediakan kaedah kilang untuk mencipta set pemalar enum.

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: Operasi Set

EnumSet menyokong operasi set standard — gabungan, persilangan dan pelengkap. Operasi ini amat pantas kerana pelaksanaannya menggunakan vektor bit.

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: Memetakan Enum kepada Nilai

EnumMap menggunakan ordinal enum sebagai indeks tatasusunan secara dalaman — carian O(1) yang lebih pantas daripada 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: Lelaran Mengikut Susunan

EnumMap sentiasa melakukan lelaran pada kunci mengikut susunan pengisytiharan enum — bukan susunan sisipan atau susunan cincangan.

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

Sistem Kebenaran dengan EnumSet

Sistem kebenaran berasaskan peranan yang menggunakan EnumSet untuk semakan kebenaran yang cekap dan reka bentuk API yang kemas.

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

Bendera Ciri dengan EnumMap

EnumMap sangat sesuai untuk sistem bendera ciri: carian O(1) yang pantas menggunakan kunci enum.

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

Prestasi: EnumSet berbanding HashSet

EnumSet menggunakan satu topeng bit long (untuk enum dengan <=64 pemalar) — operasinya ialah operasi bit O(1). HashSet menggunakan baldi cincangan — lebih perlahan dan mempunyai overhed yang lebih besar.

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

getOrDefault dan computeIfAbsent dalam EnumMap

EnumMap menyokong semua operasi pemetaan termasuk getOrDefault, computeIfAbsent dan penggabungan.

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()));
// []

Corak Multimap dengan EnumMap

Gabungkan EnumMap dengan nilai List untuk mencipta multimap berkunci enum — pengumpulan item mengikut kategori yang cekap.

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(", "))));

Bila Hendak Menggunakan EnumSet berbanding EnumMap

Ringkasan masa untuk memilih setiap satu:

  • EnumSet: apabila anda memerlukan set nilai enum — kebenaran, ciri yang aktif dan hari yang dipilih
  • EnumMap: apabila anda memetakan setiap pemalar enum kepada suatu nilai — konfigurasi bagi setiap ciri, skor bagi setiap peringkat dan item bagi setiap kategori
  • Kedua-duanya: lebih baik daripada HashSet/HashMap untuk kunci enum — lebih pantas, menggunakan kurang memori dan mengekalkan susunan

Semakan Pantas

Apakah struktur data dalaman yang digunakan oleh EnumSet untuk enum dengan 64 pemalar atau kurang?

Imbas Kembali: EnumSet dan EnumMap

Perkara penting:

  • EnumSet menggunakan vektor bit — amat pantas untuk set enum yang kecil
  • EnumSet.of(), range(), allOf() dan noneOf() ialah kaedah kilang yang biasa
  • EnumMap menggunakan tatasusunan berindeks ordinal — carian O(1), disusun mengikut pengisytiharan
  • Gunakan EnumSet untuk set kebenaran, bendera ciri dan penapisan hari dalam minggu
  • Gunakan EnumMap untuk konfigurasi mengikut kategori, jadual pemarkahan dan pemetaan ciri kepada nilai
  • Kedua-duanya mengekalkan susunan pengisytiharan enum dan lebih cekap daripada koleksi berasaskan cincangan
Percuma untuk bermula

Pelajari Java dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
104
Pelajaran
374

Soalan Lazim

Adakah pelajaran “EnumSet dan EnumMap” percuma?

Ya — teks penuh “EnumSet dan EnumMap” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “EnumSet dan EnumMap”?

Gunakan EnumSet dan EnumMap untuk koleksi berasaskan enum yang cekap dan selamat dari segi jenis. Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Java Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “EnumSet dan EnumMap” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Mentakrifkan dan Menggunakan Enum
  2. Enum dengan Medan dan Kaedah
  3. Ungkapan switch dengan Enum
  4. EnumSet dan EnumMap
← Kembali ke Java Academy