EnumSet dan EnumMap
Gunakan EnumSet dan EnumMap untuk koleksi berbasis enum yang efisien dan aman terhadap tipe.
EnumSet dan EnumMap adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.
EnumSet dan EnumMap
EnumSet dan EnumMap adalah implementasi koleksi untuk enumerasi yang sangat dioptimalkan. Keduanya menggunakan vektor bit secara internal — jauh lebih cepat daripada HashSet/HashMap untuk kunci enumerasi.
EnumSet: Membuat Set
EnumSet menyediakan metode pabrik untuk membuat set berisi konstanta enumerasi.
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()); // 7EnumSet: Operasi Set
EnumSet mendukung operasi set standar — gabungan, irisan, dan komplemen. Operasi ini sangat cepat berkat implementasi 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 Enumerasi ke Nilai
EnumMap menggunakan ordinal enumerasi sebagai indeks array secara internal — pencarian O(1) yang lebih cepat 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: $581450EnumMap: Iterasi Berurutan
EnumMap selalu melakukan iterasi pada kunci sesuai urutan deklarasi enumerasi — bukan urutan penyisipan atau urutan hash.
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: 1420Sistem Izin dengan EnumSet
Sistem izin berbasis peran yang menggunakan EnumSet untuk pemeriksaan izin yang efisien dan desain API yang rapi.
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)); // falseFeature Flags dengan EnumMap
EnumMap sangat cocok untuk sistem feature flag: pencarian O(1) yang cepat dengan kunci enumerasi.
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)); // falseKinerja: EnumSet vs HashSet
EnumSet menggunakan satu bitmask long (untuk enumerasi dengan <=64 konstanta) — operasinya berupa operasi bit O(1). HashSet menggunakan bucket hash — lebih lambat dan memiliki beban tambahan 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)); // truegetOrDefault dan computeIfAbsent pada EnumMap
EnumMap mendukung semua operasi Map, 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()));
// []Pola Multimap dengan EnumMap
Gabungkan EnumMap dengan nilai List untuk membuat multimap berkunci enumerasi — pengelompokan item berdasarkan kategori yang efisien.
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(", "))));Kapan Menggunakan EnumSet vs EnumMap
Ringkasan kapan harus memilih masing-masing:
- EnumSet: saat Anda memerlukan set berisi nilai enumerasi — izin, fitur aktif, dan hari yang dipilih
- EnumMap: saat Anda memetakan setiap konstanta enumerasi ke suatu nilai — konfigurasi per fitur, skor per tingkatan, dan item per kategori
- Keduanya: lebih baik digunakan daripada HashSet/HashMap untuk kunci enumerasi — lebih cepat, menggunakan lebih sedikit memori, dan mempertahankan urutan
Pemeriksaan Singkat
Struktur data internal apa yang digunakan EnumSet untuk enumerasi dengan 64 konstanta atau kurang?
Rangkuman: EnumSet dan EnumMap
Hal-hal penting:
- EnumSet menggunakan vektor bit — sangat cepat untuk set enumerasi berukuran kecil
- EnumSet.of(), range(), allOf(), noneOf() adalah metode pabrik yang umum
- EnumMap menggunakan array yang diindeks berdasarkan ordinal — pencarian O(1), dengan urutan sesuai deklarasi
- Gunakan EnumSet untuk set izin, feature flag, dan penyaringan hari dalam seminggu
- Gunakan EnumMap untuk konfigurasi per kategori, tabel penilaian, dan pemetaan fitur ke nilai
- Keduanya mempertahankan urutan deklarasi enumerasi dan lebih efisien daripada koleksi berbasis hash
Pertanyaan yang Sering Diajukan
Apakah pelajaran “EnumSet dan EnumMap” gratis?
Ya — teks lengkap “EnumSet dan EnumMap” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “EnumSet dan EnumMap”?
Gunakan EnumSet dan EnumMap untuk koleksi berbasis enum yang efisien dan aman terhadap tipe. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Java Academy?
Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “EnumSet dan EnumMap” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mendefinisikan dan Menggunakan Enum
- Enum dengan Field dan Metode
- Ekspresi Switch dengan Enum
- EnumSet dan EnumMap