-
Sadrazamv4
instagram:sadrazam.spy Tg:Sadrazamv4
🚀 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! ☕✨
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