Yazılım geliştirme sürecinde, verileri depolamak için genellikle dizileri (arrays) veya ArrayList gibi dinamik listeleri kullanırız. Ancak bu yapıların çok temel bir özelliği vardır: İçlerine aynı veriden istediğiniz kadar ekleyebilirsiniz. Peki ya bir e-ticaret sitesinde kayıtlı olan “benzersiz” e-posta adreslerinin bir listesini tutmak isterseniz? Ya da bir metin dosyasındaki kelimeleri sayarken her kelimenin listeye sadece bir kez eklenmesini garanti altına almanız gerekirse?
İşte bu tür senaryolarda, aynı verinin tekrar (duplicate) edilmesine kesinlikle izin vermeyen Set (Küme) arayüzü ve onun en popüler iki uygulayıcısı olan HashSet ile TreeSet sınıfları imdadımıza yetişir.
Bu kapsamlı rehberimizde, Java Collections Framework’ün (Koleksiyonlar Çatısı) en önemli parçalarından biri olan Set yapısını, matematiksel kümelerden ilham alan çalışma mantığını ve HashSet ile TreeSet arasındaki kritik farkları örneklerle adım adım inceleyeceğiz.
1. Java’da Set (Küme) Arayüzü Nedir?
Java’da Set, koleksiyonlar hiyerarşisinin (Collection Framework) temel bir arayüzüdür (interface). En belirleyici özelliği ve var oluş amacı şudur: Bir Set koleksiyonu içerisinde hiçbir nesne (veri) birden fazla kez bulunamaz,.
Matematik derslerindeki “kümeler” konusunu hatırlayın. Bir A kümesi {1, 2, 3} elemanlarından oluşuyorsa, bu kümeye tekrar 2 rakamını eklemek istediğinizde kümenin yapısı değişmez, küme yine {1, 2, 3} olarak kalır. Java’daki Set arayüzü de tam olarak bu matematiksel mantıkla çalışır. Siz listeye var olan bir elemanı tekrar eklemeye çalışırsanız, Set bu işlemi sessizce görmezden gelir ve veriyi eklemez.
Set<T> bir arayüz (interface) olduğu için doğrudan new Set() şeklinde nesnesi oluşturulamaz. Bunun yerine, bu arayüzü uygulayan (implement eden) somut sınıfları kullanmamız gerekir. Java dilinde Set arayüzünü uygulayan en yaygın iki sınıf HashSet ve TreeSet‘tir.
2. HashSet Nedir ve Nasıl Çalışır?
HashSet, elemanlarını depolamak için arka planda bir “Karma Tablosu” (Hash Table) veri yapısını kullanan bir Set türüdür. Java dünyasında benzersiz verilerle çalışırken en çok tercih edilen ve en hızlı olan sınıftır.
HashSet’in Temel Özellikleri:
- İnanılmaz Hızlıdır: Eleman ekleme (
add), çıkarma (remove) ve arama (contains) işlemleri, karma (hash) algoritması sayesinde mükemmel bir hızda (O(1) sabit zaman karmaşıklığında) gerçekleşir. - Sırasızdır (Unordered): HashSet içine eklediğiniz elemanların bellekte hangi sırayla tutulacağını veya ekrana hangi sırayla yazdırılacağını asla garanti etmez. Veriler, kendi üretilen karma kodlarına (hash codes) göre tamamen rastgele ve dağınık bir sırada depolanır.
- Tek Bir Null Değere İzin Verir: HashSet içerisine yalnızca bir adet
null(boş) değer ekleyebilirsiniz.
HashSet Kullanım Örneği
Aşağıdaki örnekte, bir çekilişe katılan benzersiz bilet numaralarını tutan bir program yazalım:
import java.util.HashSet;
import java.util.Set;
public class HashSetOrnegi {
public static void main(String[] args) {
// Sadece String tutabilen bir HashSet oluşturuyoruz
Set<String> cekilisListesi = new HashSet<>();
// Kümeye eleman ekliyoruz
cekilisListesi.add("Bilet-101");
cekilisListesi.add("Bilet-205");
cekilisListesi.add("Bilet-308");
// DİKKAT: Aynı bileti tekrar eklemeye çalışıyoruz!
boolean eklendiMi = cekilisListesi.add("Bilet-101");
System.out.println("Aynı bilet tekrar eklendi mi? : " + eklendiMi); // Çıktı: false
// Set'in içeriğini ve boyutunu yazdıralım
System.out.println("Çekiliş Listesindeki Biletler: " + cekilisListesi);
System.out.println("Toplam benzersiz bilet sayısı: " + cekilisListesi.size());
}
}
Bu kodu çalıştırdığınızda, "Bilet-101" metnini iki kez eklemeye çalışmamıza rağmen HashSet’in bunu reddettiğini (false döndürdüğünü) ve toplam eleman sayısının 3 olarak kaldığını göreceksiniz. Ayrıca ekrana yazdırılan biletlerin sırası, sizin kodda eklediğiniz sıradan tamamen farklı olabilir.
3. TreeSet Nedir ve Nasıl Çalışır?
TreeSet, elemanlarını depolamak için arka planda dengeli bir ikili arama ağacı (balanced binary sort tree) veri yapısını kullanan bir Set türüdür.
TreeSet’in Temel Özellikleri:
- Otomatik Sıralama (Sorted): TreeSet’i HashSet’ten ayıran en büyük fark budur. TreeSet içine eklenen her eleman, anında artan sırada (ascending order) sıralanır. Eğer sayılar eklerseniz küçükten büyüğe, metinler (String) eklerseniz A’dan Z’ye alfabetik olarak sıralı bir küme elde edersiniz,.
- Daha Yavaştır: Elemanlar her eklendiğinde ağaç yapısı üzerinde bir sıralama işlemi yapıldığı için, HashSet’e göre biraz daha yavaş çalışır (O(log n) zaman karmaşıklığı).
- Null Değer Alamaz: Sıralama yapabilmek için elemanları birbiriyle kıyaslaması (compare) gerekir.
null(boş) bir değer başka bir değerle kıyaslanamayacağı için, TreeSet’enulleklemeye çalışırsanız programınız hata (NullPointerException) verir.
TreeSet Kullanım Örneği
Bir sınıftaki öğrencilerin isimlerini tuttuğumuzu ve bu isimleri her zaman alfabetik sırayla görmek istediğimizi varsayalım:
import java.util.TreeSet;
import java.util.Set;
public class TreeSetOrnegi {
public static void main(String[] args) {
// Otomatik sıralama yapan bir TreeSet oluşturuyoruz
Set<String> ogrenciIsimleri = new TreeSet<>();
// İsimleri karışık bir sırayla ekliyoruz
ogrenciIsimleri.add("Zeynep");
ogrenciIsimleri.add("Ahmet");
ogrenciIsimleri.add("Can");
ogrenciIsimleri.add("Burak");
// Ahmet ismini tekrar eklemeyi deniyoruz (Reddedilecektir)
ogrenciIsimleri.add("Ahmet");
// Set'in içeriğini yazdıralım
System.out.println("Sınıf Listesi: " + ogrenciIsimleri);
}
}
Bu kodun çıktısı kesinlikle şu şekilde olacaktır: [Ahmet, Burak, Can, Zeynep]. Biz Zeynep’i ilk sıraya eklemiş olsak bile, TreeSet arka planda isimleri anında alfabetik olarak sıralamıştır.
4. Profesyonel Bir İpucu: ArrayList’ten Tekrarları Temizlemek
Yazılım geliştirirken sıkça karşılaşılan bir problem, içi tekrar eden (duplicate) verilerle dolu olan bir ArrayList‘i temizlemektir. Sırf bu iş için uzun for döngüleri kurmanıza gerek yoktur. Bir Java Set koleksiyonunun kurucusu (constructor), parametre olarak başka bir koleksiyon alabilir.
Elinizdeki listeyi bir TreeSet içine atarak tek satırda hem tekrarlardan kurtulabilir hem de veriyi sıralayabilirsiniz!
import java.util.*;
public class ListeTemizleyici {
public static void main(String[] args) {
// Tekrar eden verilerle dolu bir liste
List<String> karisikListe = Arrays.asList("Elma", "Armut", "Muz", "Elma", "Çilek", "Muz");
// Listeyi Set'e çevir (Tekrarlar silinir ve A-Z sıralanır)
Set<String> temizVeSiraliSet = new TreeSet<>(karisikListe);
System.out.println("Temizlenmiş Hali: " + temizVeSiraliSet);
// Çıktı: [Armut, Elma, Muz, Çilek]
}
}
5. HashSet ve TreeSet Arasındaki Temel Farklar Nelerdir?
Yeni başlayan bir yazılımcının karar verirken kullanabileceği karşılaştırma tablosu şöyledir:
| Özellik | HashSet | TreeSet |
|---|---|---|
| Sıralama (Order) | Sırasızdır. Elemanlar rastgele dizilir. | Sıralıdır. Elemanlar otomatik olarak sıralanır. |
| Hız (Performans) | Çok hızlıdır. Ekleme ve arama anında gerçekleşir. | Daha yavaştır. Ekleme sırasında sıralama algoritması çalışır. |
| Arka Plan Yapısı | Hash Table (Karma Tablosu). | Red-Black Tree (Dengeli İkili Ağaç). |
| Null İzni | Sadece 1 adet null değer kabul eder. | null değer kabul etmez (Hata verir). |
Sonuç: Hangisini Ne Zaman Seçmeliyiz?
Koleksiyonlar çatısında “en iyi” veri yapısı diye bir şey yoktur; “ihtiyacınıza en uygun” veri yapısı vardır.
- Eğer projenizde verilerin hangi sırayla durduğunun hiçbir önemi yoksa, tek amacınız “bu veri kümenin içinde var mı, yok mu?” sorusuna olabilecek en yüksek hızda cevap bulmaksa, kesinlikle
HashSetkullanmalısınız. Java dünyasındaki genel amaçlı benzersiz veri işlemlerinin %90’ı HashSet ile çözülür. - Eğer projenizde sakladığınız kelimeleri, isimleri veya puanları sürekli olarak sıralı (A’dan Z’ye veya küçükten büyüğe) listelemeniz gerekiyorsa,
TreeSetsizin için biçilmiş kaftandır. Sizi ayrıca bir sıralama kodu (sorting algorithm) yazma zahmetinden kurtarır.
Java’da benzersiz koleksiyonların nasıl çalıştığını anlamak, verimli ve temiz kod (clean code) yazmanın temel taşlarından biridir. Kendi bilgisayarınızda bir HashSet ve TreeSet oluşturup aralarındaki performans ve sıralama farklarını bizzat deneyimleyerek bu konuyu pekiştirebilirsiniz!





