🚀 BAŞTAN SONA JAVA DİLİ BÖLÜM-15: Map Arayüzü (HashMap, LinkedHashMap, TreeMap) 🗺️

Konu Özeti

Java'da Map arayüzü, anahtar-değer çiftleriyle veri saklamayı sağlar. HashMap en hızlı ve sırasız, LinkedHashMap ekleme sırasını korur, TreeMap ise anahtarları doğal sıralamaya göre tutar. Map üzerinde gezinmek için keySet, entrySet ve forEach yöntemleri kullanılır. Ayrıca put, get, remove gibi temel metotlar ve null anahtar kullanımındaki farklılıklar ele alınmıştır.

🚀 BAŞTAN SONA JAVA DİLİ BÖLÜM-15: Map Arayüzü (HashMap, LinkedHashMap, TreeMap) 🗺️

Selamlar! Serimizin 15. bölümüne hoş geldiniz.

Önceki bölümde tekrareden elemanlara izin vermeyen `Set` arayüzünü, `HashSet`, `LinkedHashSet`, `TreeSet` sınıflarını ve `hashCode()` / `equals()` ilişkisini öğrenmiştik. Bu bölümde ise verileri **Anahtar-Değer (Key-Value)** çiftleri şeklinde saklamamızı sağlayan ve yazılım dünyasında en çok kullanılan veri yapılarından biri olan **`Map` Arayüzünü** inceleyeceğiz.

---

📌 1. `Map` Arayüzü Nedir ve Nasıl Çalışır? 🔑

`Map`, verileri tekil bir **Anahtar (Key)** ve bu anahtara karşılık gelen **Değer (Value)** eşleşmesiyle saklar.

### Temel Özellikleri:
• **Anahtarlar (Keys) BENZERSİZDİR (Unique):** Bir Map içinde aynı Key'den sadece bir adet bulunabilir. Aynı Key ile yeni bir değer eklendiğinde eski değerin üzerine yazılır (Overwrite).
• **Değerler (Values) Tekrar Edebilir:** Farklı anahtarlar aynı değere sahip olabilir (örneğin iki farklı kullanıcının yaşının 25 olması gibi).
• Hızlı erişim imkanı sunar: Veriye ulaşmak için indekse değil, doğrudan **Key**'e başvurulur.

---

🏗️ 2. `Map` Sınıfları ve Aralarındaki Farklar 📊

Java'da `Map` arayüzünü uygulayan 3 ana sınıf bulunur:

### A. `HashMap` (En Hızlı, Sırasız)
• Arka planda bir **Hash Tablosu** kullanır.
• Anahtarları herhangi bir sıraya koymaz; rastgele saklar.
• Ekleme, silme ve arama işlemleri ortalamada $O(1)$ sürede tamamlanır (Ultra Hızlı).
• Bir adet `null` key ve dilediğiniz kadar `null` value alabilir.

### B. `LinkedHashMap` (Ekleme Sıralı)
• Arka planda çift yönlü bağlı liste (Doubly Linked List) ile hash tablosunu birleştirir.
• Anahtarları **eklenme sırasına (insertion order)** göre saklar.
• `HashMap`'e göre milisaniyelik bellek ve hız farkı vardır.

### C. `TreeMap` (Anahtarlara Göre Sıralı)
• Arka planda **Red-Black Tree** veri yapısını kullanır.
• Anahtarları (Keys) doğal sıralamasına göre (sayılar küçükten büyüğe, metinler A-Z alfabetik) sıralı saklar.
• `null` key kabul etmez! Arama karmaşıklığı $O(\log n)$ seviyesindedir.

---

🧪 3. `HashMap` Temel Metotları ve Kullanımı 🚀

import java.util.HashMap;
import java.util.Map;

public class Main {
public static void main(String[] args) {
// Key: Integer (Öğrenci No), Value: String (Öğrenci Adı)
Map<Integer, String> ogrenciler = new HashMap<>();

// 1. Eleman Ekleme / Güncelleme (`put`)
ogrenciler.put(101, "Ahmet Yılmaz");
ogrenciler.put(102, "Ayşe Kaya");
ogrenciler.put(103, "Mehmet Demir");

// Aynı Key ile tekrar ekleme yapılırsa DEĞER GÜNCELLENİR:
ogrenciler.put(102, "Ayşe Kaya Yılmaz"); // 102 nolu öğrencinin adı güncellendi

System.out.println("Tüm Map: " + ogrenciler);

// 2. Eleman Okuma (`get`)
System.out.println("101 Nolu Öğrenci: " + ogrenciler.get(101));

// 3. Varsayılan Değerli Okuma (`getOrDefault`)
// Eğer Key yoksa HATA vermez, belirlediğiniz varsayılan değeri döner:
System.out.println("999 Nolu Öğrenci: " + ogrenciler.getOrDefault(999, "Kayıt Bulunamadı!"));

// 4. Anahtar ve Değer Var Mı Kontrolü (`containsKey`, `containsValue`)
System.out.println("103 Nolu Key Var Mı?: " + ogrenciler.containsKey(103));
System.out.println("'Ayşe' Değeri Var Mı?: " + ogrenciler.containsValue("Ayşe Kaya Yılmaz"));

// 5. Eleman Silme (`remove`)
ogrenciler.remove(103);
System.out.println("103 Silindikten Sonra Boyut: " + ogrenciler.size());
}
}

---

🔄 4. `Map` Üzerinde Gezinme (Iteration) Yöntemleri 🌀

`Map` yapısı doğrudan `Iterable` olmadığı için standart for döngüsü ile gezilemez. Gezinmek için 3 farklı yöntem kullanılır:

import java.util.HashMap;
import java.util.Map;

public class Main {
public static void main(String[] args) {
Map<String, Double> urunFiyatlari = new HashMap<>();
urunFiyatlari.put("Laptop", 35000.0);
urunFiyatlari.put("Telefon", 28000.0);
urunFiyatlari.put("Kulaklık", 2500.0);

// Yöntem 1: Sadece Anahtarlar Üzerinde Gezinme (`keySet()`)
System.out.println("--- Ürün Adları (Keys) ---");
for (String urun : urunFiyatlari.keySet()) {
System.out.println("Ürün: " + urun + " | Fiyat: " + urunFiyatlari.get(urun));
}

// Yöntem 2: Hem Key Hem Value Üzerinde Gezinme (`entrySet()`) -> EN VERİMLİ YÖNTEM!
System.out.println("\n--- EntrySet İle Gezinme ---");
for (Map.Entry<String, Double> entry : urunFiyatlari.entrySet()) {
System.out.println("Key: " + entry.getKey() + " -> Value: " + entry.getValue() + " TL");
}

// Yöntem 3: Lambda ve `forEach` Kullanımı (Java 8+)
System.out.println("\n--- Lambda forEach ---");
urunFiyatlari.forEach((key, value) -> {
System.out.println(key + " : " + value);
});
}
}

---

⚖️ 5. `HashMap`, `LinkedHashMap` ve `TreeMap` Karşılaştırması 📋

| Özellik | `HashMap` | `LinkedHashMap` | `TreeMap` |
| :--- | :--- | :--- | :--- |
| **Sıralama Mantığı** | Rastgele / Sırasız | Ekleme Sırasına Göre | Anahtarın Doğal Sıralaması (A-Z / 1-9) |
| **İşlem Hızı** | ⚡ **Çok Hızlı ($O(1)$)** | ⚡ **Hızlı ($O(1)$)** | 🐢 **Orta ($O(\log n)$)** |
| **`null` Key İzni** | ✅ İzin verir (1 adet) | ✅ İzin verir (1 adet) | ❌ **İzin VERMEZ!** |
| **Arka Plan Mimarisi** | Hash Table | Hash Table + Linked List | Red-Black Tree |

---

📝 Bölüm Özeti ve Gelecek Bölüm 🔮

Bu bölümde Key-Value mimarisini, `HashMap`, `LinkedHashMap` ve `TreeMap` sınıflarını ve Map üzerinde gezinme yöntemlerini öğrendik.

👉 **Bölüm 16'da Bizi Ne Bekliyor?**
• Hata Yönetimi: **Exception Handling** 🚨
• `try-catch-finally` Blokları
• **Checked vs Unchecked Exceptions** (Kontrollü ve Kontrolsüz Hatalar)
• `throw` ve `throws` Anahtar Keli
meleri
• Özel Hata Sınıfı Yazma (Custom Exceptions)

Sorularınızı konu altından iletebilirsiniz. Bir sonraki bölümde görüşmek üzere! ☕✨

🔒 Bu içeriği görmek için giriş yapın

 
Yanıt yazmak için giriş yapmalısınız
Forum özelliklerini kullanmak ve Level 2 üyelik satın almak için hesabınıza giriş yapın.
135,053Konular
3,297,743Mesajlar
326,239Kullanıcılar
Üst Alt