Eğitim Portalı/Java/Set Aileleri (HashSet, LinkedHashSet, TreeSet, EnumSet)
Java01-java/51-set-aileleri

Set Aileleri (HashSet, LinkedHashSet, TreeSet, EnumSet)

Set (küme), benzersiz elemanlar topluluğudur: aynı eleman iki kez bulunamaz. Bir listede yinelenenleri temizlemek, "bu öğe daha önce görüldü mü?" diye sormak veya matematiksel küme işlemleri yapmak için kullanılır. Ma…

Set Aileleri (HashSet, LinkedHashSet, TreeSet, EnumSet)

Set (küme), benzersiz elemanlar topluluğudur: aynı eleman iki kez bulunamaz. Bir listede yinelenenleri temizlemek, "bu öğe daha önce görüldü mü?" diye sormak veya matematiksel küme işlemleri yapmak için kullanılır. Map ailesinde olduğu gibi, Set'in de farklı ihtiyaçlara yanıt veren dört temel uygulaması vardır.

HashSet: hızlı ve sırasız

En çok kullanılan Set. Hash tabanlıdır; add/contains/remove ortalama O(1). Elemanları sırasız tutar. İki klasik kullanımı:

// 1) Yinelenenleri temizle
Set<Integer> benzersiz = new HashSet<>(tekrarliListe);

// 2) Üyelik testi (çok hızlı "var mı?")
if (gorulenler.contains(x)) { ... }

Benzersizlik, elemanların equals() ve hashCode() metotlarına dayanır; kendi sınıfını Set'e koyacaksan ikisini doğru tanımla (record'lar otomatik sağlar).

Küme işlemleri (set algebra)

İki kümeyle matematiksel işlemler, standart metotlarla yapılır:

birlesim.addAll(b);    // A ∪ B  (birleşim)
kesisim.retainAll(b);  // A ∩ B  (kesişim)
fark.removeAll(b);     // A \ B  (fark)

Örnek 1 (./Ornek1.java) benzersizliği, yinelenen temizlemeyi, küme işlemlerini ve ekleme sırasını koruyan LinkedHashSet'i gösterir.

LinkedHashSet: ekleme sırası

HashSet hızındadır ama elemanları eklendikleri sırada tutar. "Benzersiz ama sıralı görünsün" (örn. yinelenenleri at ama orijinal sırayı koru) gerektiğinde idealdir.

TreeSet: sıralı küme

Elemanları sıralı tutar (doğal sıra veya Comparator). Erişim O(log n). TreeMap'in küme karşılığıdır ve aynı komşuluk/aralık metotlarını sunar:

set.first(); set.last();
set.floor(40); set.ceiling(40);          // <=40 / >=40
set.headSet(50); set.tailSet(50); set.subSet(20, 65); // aralıklar

Örnek 2 (./Ornek2.java) bunları gösterir. "Sıralı benzersiz" veya "şu aralıktaki benzersizler" gerektiğinde kullanılır.

EnumSet: enum'lar için özel

Elemanlar bir enum ise EnumSet kullan. İçte bir bit-maske tutar; bu yüzden inanılmaz hızlı ve kompakttır. Yetki/bayrak (flag) kümeleri için biçilmiş kaftandır:

EnumSet<Yetki> editor = EnumSet.of(Yetki.OKU, Yetki.YAZ);
EnumSet<Yetki> admin = EnumSet.allOf(Yetki.class);
EnumSet.complementOf(editor);  // tümleyen

Hangisini seçmeli?

İhtiyaçSınıf
Hızlı, sıra önemsizHashSet
Ekleme sırası korunsunLinkedHashSet
Sıralı / aralık sorgusuTreeSet
Elemanlar enumEnumSet
Çok thread'liConcurrentHashMap.newKeySet() / CopyOnWriteArraySet

Özet

Set'in benzersizlik garantisini; hızlı HashSet ile küme işlemlerini ve sırayı koruyan LinkedHashSet'i (Örnek 1); sıralı TreeSet ile enum'lara özel EnumSet'i (Örnek 2) öğrendik. Map ailesindeki seçim mantığının aynısı Set için de geçerlidir. Sırada, öncelik ve uç-erişim koleksiyonları: PriorityQueue ve ArrayDeque.

Kod Örnekleri(2)

Ornek1

çalıştırılabilir
Ornek1.java
1// Ornek1: HashSet (benzersizlik + küme işlemleri) ve LinkedHashSet (ekleme sırası).
2// Çalıştırma: java Ornek1.java
3import java.util.HashSet;
4import java.util.LinkedHashSet;
5import java.util.List;
6import java.util.Set;
7
8public class Ornek1 {
9
10    public static void main(String[] args) {
11        // Set: TEKRAR yok. Aynı eleman ikinci kez eklenince yok sayılır.
12        Set<String> kume = new HashSet<>();
13        kume.add("elma"); kume.add("armut"); kume.add("elma"); // ikinci "elma" yok sayılır
14        System.out.println("HashSet: " + kume + " (boyut: " + kume.size() + ")");
15
16        // Yinelenenleri (duplicate) temizlemenin en hızlı yolu:
17        List<Integer> tekrarli = List.of(1, 2, 2, 3, 3, 3, 4);
18        Set<Integer> benzersiz = new HashSet<>(tekrarli);
19        System.out.println("Yinelenensiz: " + benzersiz);
20
21        // KÜME İŞLEMLERİ (set algebra):
22        Set<Integer> a = new HashSet<>(Set.of(1, 2, 3, 4));
23        Set<Integer> b = new HashSet<>(Set.of(3, 4, 5, 6));
24
25        Set<Integer> birlesim = new HashSet<>(a); birlesim.addAll(b);     // A ∪ B
26        Set<Integer> kesisim = new HashSet<>(a);  kesisim.retainAll(b);    // A ∩ B
27        Set<Integer> fark = new HashSet<>(a);     fark.removeAll(b);       // A \ B
28        System.out.println("Birleşim (A∪B): " + birlesim);
29        System.out.println("Kesişim (A∩B): " + kesisim);
30        System.out.println("Fark (A\\B)   : " + fark);
31
32        // LinkedHashSet: benzersizlik + EKLEME sırasını korur.
33        Set<String> sirali = new LinkedHashSet<>();
34        sirali.add("zebra"); sirali.add("at"); sirali.add("kuş"); sirali.add("at");
35        System.out.println("\nLinkedHashSet (ekleme sırası): " + sirali);
36
37        System.out.println("""
38
39                --- HashSet ve LinkedHashSet ---
40                Set: benzersiz elemanlar topluluğu. contains/add/remove ortalama O(1) (hash tabanlı).
41                En yaygın kullanım: yinelenenleri temizlemek ve "üyelik" (var mı?) testi.
42                Küme işlemleri: addAll=birleşim, retainAll=kesişim, removeAll=fark.
43                HashSet sırasız; LinkedHashSet ekleme sırasını korur; TreeSet sıralı (sonraki örnek).
44                NOT: eleman sınıflarının equals()/hashCode()'u doğru olmalı (benzersizlik buna dayanır).""");
45    }
46}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.

Ornek2

çalıştırılabilir
Ornek2.java
1// Ornek2: TreeSet (sıralı + komşuluk/aralık) ve EnumSet (enum için hızlı küme).
2// Çalıştırma: java Ornek2.java
3import java.util.EnumSet;
4import java.util.TreeSet;
5
6public class Ornek2 {
7
8    enum Yetki { OKU, YAZ, SIL, YONET }
9
10    public static void main(String[] args) {
11        // TreeSet: elemanları SIRALI tutar; navigation metotları sağlar.
12        TreeSet<Integer> sayilar = new TreeSet<>(java.util.List.of(50, 20, 80, 10, 65, 35));
13        System.out.println("TreeSet (sıralı): " + sayilar);
14        System.out.println("first/last: " + sayilar.first() + " / " + sayilar.last());
15        System.out.println("floor(40)   = " + sayilar.floor(40));    // <=40 -> 35
16        System.out.println("ceiling(40) = " + sayilar.ceiling(40));  // >=40 -> 50
17        System.out.println("headSet(50) = " + sayilar.headSet(50));  // <50
18        System.out.println("tailSet(50) = " + sayilar.tailSet(50));  // >=50
19        System.out.println("subSet(20,65)= " + sayilar.subSet(20, 65));
20
21        // EnumSet: enum değerlerinden oluşan, bit-maske kadar hızlı/kompakt küme.
22        EnumSet<Yetki> editor = EnumSet.of(Yetki.OKU, Yetki.YAZ);
23        EnumSet<Yetki> admin = EnumSet.allOf(Yetki.class);
24        EnumSet<Yetki> saltOkur = EnumSet.of(Yetki.OKU);
25        System.out.println("\nEditor yetkileri: " + editor);
26        System.out.println("Admin yetkileri : " + admin);
27        System.out.println("Editor YAZ yapabilir mi? " + editor.contains(Yetki.YAZ));
28        System.out.println("Tümleyen (editor değil): " + EnumSet.complementOf(editor));
29
30        System.out.println("""
31
32                --- TreeSet ve EnumSet ---
33                TreeSet: benzersiz + SIRALI. first/last, floor/ceiling/higher/lower (komşuluk),
34                  headSet/tailSet/subSet (aralık). Erişim O(log n). "Sıralı benzersiz" gerektiğinde.
35                EnumSet: yalnızca enum elemanları için; içte bit-maske -> çok hızlı ve kompakt.
36                  Yetki/bayrak (flag) kümeleri için idealdir (of/allOf/noneOf/complementOf).
37                Özet: hızlı -> HashSet, ekleme sırası -> LinkedHashSet, sıralı -> TreeSet, enum -> EnumSet.""");
38    }
39}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.