EnumMap
Enum anahtarlı verimli eşlemeler
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.
EnumMap Nedir?
EnumMap, anahtarları tek bir numaralandırma türünün sabitleri olan özelleştirilmiş bir Map uygulamasıdır.
İçeride, sabitin ordinal değerine göre dizinlenen düz bir dizi tarafından desteklenir. Bu sayede karma işlemi yapılmadan aramalar ve eklemeler son derece hızlıdır.
import java.util.EnumMap;
import java.util.Map;
public class Main {
enum Day { MON, TUE, WED }
public static void main(String[] args) {
Map<Day, String> plan = new EnumMap<>(Day.class);
plan.put(Day.MON, "Gym");
plan.put(Day.WED, "Swim");
System.out.println(plan);
}
}Oluşturma için Sınıf Gerekir
Bir EnumMap anahtar türünü baştan bilmelidir; bu nedenle oluşturucu sınıf nesnesini alır: new EnumMap<>(Day.class).
İç dizinin boyutunu sabitlerin sayısına göre bu şekilde belirler.
import java.util.EnumMap;
public class Main {
enum Priority { LOW, MEDIUM, HIGH }
public static void main(String[] args) {
EnumMap<Priority, Integer> counts = new EnumMap<>(Priority.class);
counts.put(Priority.HIGH, 5);
System.out.println(counts.get(Priority.HIGH));
}
}Dizi Destekli Hız
Anahtarlar array[ordinal] konumunda saklandığı için get ve put, HashMap'in karma işlemi ve kova taramasından daha hızlı olan doğrudan dizi erişimleridir.
Anahtarın kutulanması gerekmez ve hashCode çağrısı yapılmaz.
import java.util.EnumMap;
public class Main {
enum Slot { A, B, C, D }
public static void main(String[] args) {
EnumMap<Slot, Integer> m = new EnumMap<>(Slot.class);
for (Slot s : Slot.values()) m.put(s, s.ordinal() * 10);
System.out.println(m.get(Slot.C));
}
}Anahtar Sırasına Göre Yineleme
EnumMap, girdileri anahtarların doğal sırasına, yani bildirim sırasına göre yineler.
Bu, HashMap'in aksine kararlı ve öngörülebilir bir çıktı sağlar.
import java.util.EnumMap;
import java.util.Map;
public class Main {
enum Phase { PLAN, BUILD, SHIP }
public static void main(String[] args) {
Map<Phase, Integer> hours = new EnumMap<>(Phase.class);
hours.put(Phase.SHIP, 3);
hours.put(Phase.PLAN, 8);
hours.put(Phase.BUILD, 20);
for (Map.Entry<Phase, Integer> e : hours.entrySet()) {
System.out.println(e.getKey() + " = " + e.getValue());
}
}
}Boş Anahtarlara İzin Verilmez
EnumMap boş anahtarlara izin vermez; boş bir anahtar NullPointerException fırlatır.
Diğer Map türlerinde olduğu gibi boş değerlere izin verilir.
import java.util.EnumMap;
public class Main {
enum K { A, B }
public static void main(String[] args) {
EnumMap<K, String> m = new EnumMap<>(K.class);
m.put(K.A, null); // null value is fine
System.out.println("A -> " + m.get(K.A));
System.out.println("contains A: " + m.containsKey(K.A));
}
}EnumMap ile Gruplama
Yaygın bir kullanım, bir numaralandırma türü kategorisine göre sayma veya gruplama yapmaktır. merge saymayı kısa ve anlaşılır hâle getirir.
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
public class Main {
enum Type { FRUIT, VEG, MEAT }
record Item(String name, Type type) {}
public static void main(String[] args) {
List<Item> items = List.of(new Item("apple", Type.FRUIT), new Item("pear", Type.FRUIT), new Item("beef", Type.MEAT));
Map<Type, Integer> counts = new EnumMap<>(Type.class);
for (Item i : items) counts.merge(i.type(), 1, Integer::sum);
System.out.println(counts);
}
}getOrDefault ve computeIfAbsent
Tüm standart Map varsayılan yöntemleri çalışır. getOrDefault boş denetimlerini önler, computeIfAbsent ise değerleri gerektiğinde oluşturur.
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
public class Main {
enum Group { A, B }
public static void main(String[] args) {
Map<Group, List<String>> m = new EnumMap<>(Group.class);
m.computeIfAbsent(Group.A, k -> new ArrayList<>()).add("first");
System.out.println(m);
System.out.println(m.getOrDefault(Group.B, List.of()));
}
}Kopya Oluşturucu
EnumMap, başka bir Map kabul eden bir kopya oluşturucuya sahiptir. Kaynak bir EnumMap ise anahtar türü ondan çıkarılır.
import java.util.EnumMap;
import java.util.Map;
public class Main {
enum K { X, Y }
public static void main(String[] args) {
EnumMap<K, Integer> a = new EnumMap<>(K.class);
a.put(K.X, 1);
EnumMap<K, Integer> b = new EnumMap<>(a);
b.put(K.Y, 2);
System.out.println("copy: " + b);
}
}EnumMap ve ordinal Dizilerinin Karşılaştırması
EnumMap'ten önce insanlar ordinal() ile dizinlenen ham diziler kullanırdı. Bu yaklaşım kırılgan ve güvensizdir.
EnumMap, tür güvenliği, sınır güvenliği ve temiz bir Map arayüzüyle aynı dizi hızını sağlar.
import java.util.EnumMap;
import java.util.Map;
public class Main {
enum Season { SPRING, SUMMER, FALL, WINTER }
public static void main(String[] args) {
Map<Season, String> mood = new EnumMap<>(Season.class);
mood.put(Season.SUMMER, "sunny");
// Safer and clearer than String[] indexed by ordinal
System.out.println(mood.get(Season.SUMMER));
}
}İç İçe EnumMap'ler
Durum geçiş tablosu gibi iki numaralandırma türüyle anahtarlanan bir matrisi modellemek için EnumMap'leri iç içe kullanabilirsiniz.
import java.util.EnumMap;
import java.util.Map;
public class Main {
enum State { SOLID, LIQUID, GAS }
enum Transition { MELT, FREEZE }
public static void main(String[] args) {
Map<State, Map<Transition, State>> table = new EnumMap<>(State.class);
Map<Transition, State> solid = new EnumMap<>(Transition.class);
solid.put(Transition.MELT, State.LIQUID);
table.put(State.SOLID, solid);
System.out.println(table.get(State.SOLID).get(Transition.MELT));
}
}Doğru Türü Seçme
Genel kural:
- Anahtarlar numaralandırma türü sabitleriyse ve bir Map istiyorsanız: EnumMap kullanın.
- Bir numaralandırma türü kümesi istiyorsanız: EnumSet kullanın.
- Anahtarlar rastgele nesnelerse: HashMap kullanın.
import java.util.EnumMap;
import java.util.Map;
public class Main {
enum Level { DEBUG, INFO, WARN, ERROR }
public static void main(String[] args) {
Map<Level, Integer> thresholds = new EnumMap<>(Level.class);
for (Level l : Level.values()) thresholds.put(l, l.ordinal() * 100);
System.out.println(thresholds);
}
}Hızlı Kontrol
EnumMap bilginizi sınayın.
Özet
EnumMap'i öğrendiniz:
- Numaralandırma türü sabitleriyle anahtarlanan, dizi destekli bir Map'tir.
- Oluşturucu anahtar sınıfını alır; boş anahtarlara izin verilmez.
- Bildirim sırasına göre yinelenir.
- Ordinal değere göre dizinlenen dizilerin güvenli ve hızlı alternatifidir.
İleri düzey numaralandırma türleri kursunu tamamladınız.
import java.util.EnumMap;
public class Main {
enum K { A }
public static void main(String[] args) {
EnumMap<K, String> m = new EnumMap<>(K.class);
m.put(K.A, "done");
System.out.println("EnumMap course complete: " + m.get(K.A));
}
}Sıkça Sorulan Sorular
“EnumMap” dersi ücretsiz mi?
Evet — “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.
“EnumMap” dersinde ne öğreneceğim?
Enum anahtarlı verimli eşlemeler 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.
“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.