🚀 BAŞTAN SONA JAVA DİLİ BÖLÜM-14: Set Arayüzü (HashSet, LinkedHashSet, TreeSet) ve hashCode/equals 🛑

Konu Özeti

Java'da Set arayüzü, tekrar eden elemanlara izin vermeyen bir koleksiyon yapısıdır. HashSet, LinkedHashSet ve TreeSet sınıfları sırasıyla sırasız, ekleme sıralı ve doğal sıralı çalışır. Özel nesnelerle kullanımda benzersizliği sağlamak için equals() ve hashCode() metotları ezilmelidir.

🚀 BAŞTAN SONA JAVA DİLİ BÖLÜM-14: Set Arayüzü (HashSet, LinkedHashSet, TreeSet) ve hashCode/equals 🛑

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

Önceki bölümde `List` arayüzünün dinamik yapıları olan `ArrayList` ve `LinkedList` sınıflarını ve aralarındaki performans farklarını incelemiştik. Bu bölümde ise koleksiyon ekosisteminin ikinci büyük ayağı olan, **tekrareden (duplicate) verilere izin vermeyen `Set` Arayüzünü**, bu arayüzü uygulayan **`HashSet`**, **`LinkedHashSet`** ve **`TreeSet`** sınıflarını ve bu sınıfların belkemiği olan **`hashCode()` ve `equals()`** metotlarını öğreneceğiz.

---

📌 1. `Set` Arayüzü Nedir ve Özellikleri Nelerdir? 🛑

`Set`, matematiksel küme mantığıyla çalışan bir koleksiyon yapısıdır.

### Temel Özellikleri:
• **Benzersizlik (Uniqueness):** Aynı elemandan küme içinde **sadece bir adet** bulunabilir. İkinci kez eklenmeye çalışılan eleman yok sayılır.
• **İndeks Yoktur:** `List` yapılarındaki gibi `get(0)` veya `set(1, val)` gibi indeks bazlı erişim metotları içermez.
• Eleman kontrolü (`contains`) ve tekilleştirme işlemleri için idealdir.

---

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

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

### A. `HashSet` (En Hızlı, Sırasız)
• Arka planda bir Hash Tablosu (Hash Table) kullanır.
• Elemanları ekleme sırasına göre **TUTMAZ**. Elemanlar tamamen rastgele (hash kodlarına göre) dizilir.
• Ekleme, çıkarma ve arama işlemleri ultra hızlıdır: $O(1)$ karmaşıklığa sahiptir.
• `null` değer eklenmesine izin verir (sadece bir tane).

### B. `LinkedHashSet` (Ekleme Sıralı)
• `HashSet`'in türevidir. Arka planda hem Hash Tablosu hem de Bağlı Liste (Linked List) tutar.
• Elemanları eklenme sırasına (insertion order) göre korur.
• `HashSet`'e göre milisaniyelik bir performans maliyeti vardır ancak sıralama garantisi sunar.

### C. `TreeSet` (Sıralı / Sorted Set)
• Arka planda **Kırmızı-Siyah Ağaç (Red-Black Tree)** veri yapısını kullanır.
• Elemanları doğal sıralamasına (A-Z alfabetik veya sayılarda küçükten büyüğe) göre saklar.
• Performansı $O(\log n)$ seviyesindedir. `null` değer alamaz!

---

🧪 3. `Set` Sınıflarının Kod Üzerinde Karşılaştırılması 🚀

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;

public class Main {
public static void main(String[] args) {
// 1. HashSet Örneği (Sıralama Garantisi Yoktur)
Set<String> hashSet = new HashSet<>();
hashSet.add("Elma");
hashSet.add("Muz");
hashSet.add("Ananas");
hashSet.add("Elma"); // Tekrar eden eleman eklenecek, YOK SAYILACAK!

System.out.println("HashSet (Sırasız) : " + hashSet);

// 2. LinkedHashSet Örneği (Ekleme Sırasını Korur)
Set<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("Elma");
linkedHashSet.add("Muz");
linkedHashSet.add("Ananas");

System.out.println("LinkedHashSet (Ekleme S.): " + linkedHashSet);

// 3. TreeSet Örneği (Doğal / Alfabetik Sıralı)
Set<String> treeSet = new TreeSet<>();
treeSet.add("Elma");
treeSet.add("Muz");
treeSet.add("Ananas");

System.out.println("TreeSet (Doğal Sıralı) : " + treeSet);
}
}

/*
Çıktı Örneği:
HashSet (Sırasız) : [Muz, Elma, Ananas]
LinkedHashSet (Ekleme S.): [Elma, Muz, Ananas]
TreeSet (Doğal Sıralı) : [Ananas, Elma, Muz]
*/

---

🧠 4. `hashCode()` ve `equals()` Metotlarının Önemi 🔑

Kendi yazdığınız özel nesneleri (Custom Classes) bir `HashSet` veya `LinkedHashSet` içinde sakladığınızda, Java'nın benzersizliği anlayabilmesi için **`equals()`** ve **`hashCode()`** metotlarını ezmek (`@Override`) **ZORUNDASINIZDIR!**

Aksi takdirde, Heap bölgesinde farklı adreslerde bulunan ancak içerikleri birebir aynı olan iki nesne farklı kabul edilir ve kükeye tekrar eklenir!

### Özel Sınıfta `equals` ve `hashCode` Yapılandırması (`Ogrenci.java`):

import java.util.Objects;

public class Ogrenci {
private int id;
private String isim;

public Ogrenci(int id, String isim) {
this.id = id;
this.isim = isim;
}

// İki nesnenin içeriğinin eşit olup olmadığını kontrol eder
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Ogrenci ogrenci = (Ogrenci) o;
return id == ogrenci.id && Objects.equals(isim, ogrenci.isim);
}

// Nesnenin Hash tablosundaki kova (bucket) indeksini hesaplar
@Override
public int hashCode() {
return Objects.hash(id, isim);
}

@Override
public String toString() {
return "Ogrenci{id=" + id + ", isim='" + isim + "'}";
}
}

---

🧪 5. Özel Nesneler İle `Set` Kullanımı (`Main.java`) 🚀

import java.util.HashSet;
import java.util.Set;

public class Main {
public static void main(String[] args) {
Set<Ogrenci> ogrenciler = new HashSet<>();

Ogrenci o1 = new Ogrenci(101, "Ahmet");
Ogrenci o2 = new Ogrenci(102, "Ayşe");
Ogrenci o3 = new Ogrenci(101, "Ahmet"); // o1 ile aynı id ve isme sahip!

ogrenciler.add(o1);
ogrenciler.add(o2);
ogrenciler.add(o3); // hashCode ve equals sayesinde tekilleştirilecek!

System.out.println("Oğrenci Sayısı: " + ogrenciler.size()); // Çıktı: 2
System.out.println("Küme İçeriği : " + ogrenciler);
}
}

---

⚖️ 6. Set Sınıfları Özet Karşılaştırma Tablosu 📋

| Sınıf | Sıralama Mantığı | Ekleme/Arama Hızı | `null` Eleman İzni |
| :--- | :--- | :--- | :--- |
| **`HashSet`** | Rastgele / Sırasız | ⚡ **Çok Hızlı ($O(1)$)** | ✅ İzin verir (1 adet) |
| **`LinkedHashSet`** | Ekleme Sırasına Göre | ⚡ **Hızlı ($O(1)$)** | ✅ İzin verir (1 adet) |
| **`TreeSet`** | Doğal Sıralama (A-Z / 1-9) | 🐢 **Orta ($O(\log n)$)** | ❌ **İzin VERMEZ!** |

---

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

Bu bölümde `Set` arayüzünün benzersizlik felsefesini, `HashSet`, `LinkedHashSet` ve `TreeSet` sınıfları arasındaki farkları ve özel sınıflar için `equals()` ile `hashCode()` ezmenin kritik önemini öğrendik.

👉 **Bölüm 15'te Bizi Ne Bekliyor?**
• Key-Value (Anahtar-Değer) Mimarisi: **`Map` Arayüzü** 🗺️
• **`HashMap`** ve Hash Tablosu Çalışma Mantığı
• **`LinkedHashMap`** ve **`TreeMap`**
• `Map`
Üzerinde Gezinme Yöntemleri (`keySet()`, `values()`, `entrySet()`)

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,091Konular
3,298,207Mesajlar
326,285Kullanıcılar
Julian Hyp3rSon Üye
Üst Alt