EnumSet ve EnumMap
Verimli ve tür güvenli enum tabanlı koleksiyonlar için EnumSet ve EnumMap kullanın.
EnumSet ve EnumMap, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
EnumSet ve EnumMap
EnumSet ve EnumMap, numaralandırma türleri için yüksek düzeyde optimize edilmiş koleksiyon uygulamalarıdır. Dahili olarak bit vektörleri kullanırlar; bu nedenle numaralandırma anahtarları için HashSet/HashMap kullanmaktan çok daha hızlıdırlar.
EnumSet: Kümeler Oluşturma
EnumSet, numaralandırma sabitlerinden oluşan kümeler oluşturmak için üretim yöntemleri sağlar.
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: Küme İşlemleri
EnumSet, standart küme işlemlerini (birleşim, kesişim ve tümleyen) destekler. Bit vektörü uygulaması sayesinde bu işlemler son derece hızlıdır.
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: Numaralandırma Türlerini Değerlere Eşleme
EnumMap, dahili olarak numaralandırma sırasını dizi dizini olarak kullanır; O(1) araması HashMap aramasından daha hızlıdır.
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: Sırayla Yineleme
EnumMap, anahtarlar üzerinde her zaman numaralandırma türündeki bildirim sırasına göre yineleme yapar; ekleme sırasına veya karma sırasına göre değil.
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: 1420EnumSet ile İzin Sistemi
Verimli izin denetimleri ve temiz bir API tasarımı için EnumSet kullanan rol tabanlı bir izin sistemi.
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)); // falseEnumMap ile Özellik Bayrakları
EnumMap, özellik bayrağı sistemleri için idealdir: numaralandırma anahtarlarıyla hızlı O(1) arama sağlar.
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)); // falsePerformans: EnumSet ve HashSet Karşılaştırması
EnumSet, 64 veya daha az sabit içeren numaralandırma türleri için tek bir long bit maskesi kullanır; işlemler O(1) bit işlemleridir. HashSet ise karma bölmeleri kullanır; daha yavaştır ve daha fazla ek yük oluşturur.
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)); // trueEnumMap getOrDefault ve computeIfAbsent
EnumMap, getOrDefault, computeIfAbsent ve merge dahil olmak üzere tüm eşleme işlemlerini destekler.
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()));
// []EnumMap ile Çoklu Eşleme Örüntüsü
Kategoriye göre öğeleri verimli biçimde gruplamak üzere numaralandırma anahtarlı bir çoklu eşleme oluşturmak için EnumMap'i List değerleriyle birleştirin.
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(", "))));EnumSet ve EnumMap Ne Zaman Kullanılmalı
Her birini ne zaman seçeceğinize dair özet:
- EnumSet: izinler, etkin özellikler ve seçili günler gibi numaralandırma değerlerinden oluşan bir kümeye ihtiyaç duyduğunuzda
- EnumMap: her numaralandırma sabitini bir değere eşlediğinizde; özellik başına yapılandırma, seviye başına puan veya kategori başına öğeler gibi
- Her ikisi de: numaralandırma anahtarları için HashSet/HashMap yerine tercih edin; daha hızlıdır, daha az bellek kullanır ve sırayı korur
Kısa Denetim
64 veya daha az sabit içeren numaralandırma türleri için EnumSet'in kullandığı dahili veri yapısı nedir?
Özet: EnumSet ve EnumMap
Temel çıkarımlar:
- EnumSet, küçük numaralandırma kümeleri için son derece hızlı olan bir bit vektörü kullanır
- EnumSet.of(), range(), allOf() ve noneOf() yaygın üretim yöntemleridir
- EnumMap, sıra numarasıyla dizinlenen dizileri kullanır; O(1) arama yapar ve bildirim sırasını korur
- İzin kümeleri, özellik bayrakları ve haftanın günlerine göre filtreleme için EnumSet kullanın
- Kategori başına yapılandırma, puanlama tabloları ve özellikten değere eşleme için EnumMap kullanın
- Her ikisi de numaralandırma bildirim sırasını korur ve karma tabanlı koleksiyonlardan daha verimlidir
Sıkça Sorulan Sorular
“EnumSet ve EnumMap” dersi ücretsiz mi?
Evet — “EnumSet ve EnumMap” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“EnumSet ve EnumMap” dersinde ne öğreneceğim?
Verimli ve tür güvenli enum tabanlı koleksiyonlar için EnumSet ve EnumMap kullanın. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“EnumSet ve EnumMap” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Enum Tanımlama ve Kullanma
- Alanlara ve Yöntemlere Sahip Enum'lar
- Enum'larla Switch İfadeleri
- EnumSet ve EnumMap