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()vehashCode()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 önemsiz | HashSet |
| Ekleme sırası korunsun | LinkedHashSet |
| Sıralı / aralık sorgusu | TreeSet |
| Elemanlar enum | EnumSet |
| Çok thread'li | ConcurrentHashMap.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ılabilir1// 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}Ornek2
çalıştırılabilir1// 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}