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