Collections 6 – Set Implementation HashSet
Merhabalar. Bu yazıda Set Interface‘in bir implementasyonu olan HashSet‘i inceleyeceğiz.
Set Interface’i kendine uygulayan bu sınıf verilerini bir Hash tablosunda tutar. Arka planda bu Hash tablosu aslında bir HashMap örneğine denk gelir. HashSet sınıfı iterasyon yapmak istendiğinde iterasyon sırası için bir garanti vermez, yani her zaman aynı sırada bir iterasyon gerçekleşeceğinin bir garantisi yoktur. HashSet null eleman tutmaya izin vermektedir.
HashSet sınıfı ekleme, silme, içerme testi ve boyut eldesi temel işlemlerde bize bir sabit zaman performansı sunar ve iyi bir performans olarak bize döner. Arkada çalışan Hash fonksiyonunun verileri bucket’lara (kovalara) dağıtıp işlem yaptığını düşünürsek performansın nereden geldiği hakkında bilgi edinebiliriz. Set üzerinde yapılacak bir iterasyon Set’in barındırdığı eleman sayısına ve arkada tutulan HashMap instance’ındaki (örneğindeki) bucket sayısına bağlıdır. Bu nedenele iterasyon performansının önem arz ettiği durumlarda HashSet’in başlangıç kapasitesini çok yüksek vermek zararımıza olur.
HashSet sınıfı doğrudan senkronize olma özelliğine sahip değildir. Eğer senkronize olmasını istersek şöyle bir kod kullanmalıyız:
Set s = Collections.synchronizedSet(new HashSet());
HashSet sınıfından türetilip kullanılacak iterator nesnesi fail-fast özelliğe sahiptir. Bu şu anlama gelir ki iterator çalışırken bir müdahele gelirse işini bırakıp ConcurrentModificationException fırlatır. Yalnız Oracle’ın dökümanına göre bu işin bir garantisi yok. Bu yüzden Oracle bu hatanın kesinlikle fırlatılacağına bağlı kalarak bir iş yapılmasını tavsiye etmiyor. ###HashSet’in Yapılandırıcıları
- HashSet () : Yeni, boş bir Set örneği oluşturur. Arka plandaki HashMap’in başlangıç kapasitesi 16’dır ve load factor özelliği de 0.75’tir.
- HashSet (Collection c) : Parametre olarak verilmiş olan Collection ile yeni bir Set örneği oluşturur.
- HashSet (int initialCapacity) : Yeni, boş bir Set örneği oluşturur ve arka plandaki HashMap örneğini verilen başlangıç kapasitesi parametresine göre load factor 0.75 olacak şekilde oluşturur.
- HashSet (int initialCapacity, float loadFactor) : Yeni, boş bir Set oluşturur ve arka plandaki HashMap örneği verilen başlangıç kapasitesi parametresi ve load factor parametresine göre oluşturur.
Bu noktada load faktörün ne olduğuna da değinelim. Az önce HashSet örneğinin arka planda bir HashMap örneğine denk geldiğini ve bu HashMap örneğinin de bucketlara sahip olduğundan bahsettik. İşte load factor arka planda bu HashMap’in ne kadarı dolduğunda boyutunun arttılması gerektiği işine bakar. Örneğin load factor 0.75 dersek HashMap %75 doluluğa ulaştığında HashMap’in boyutu bir kat yukarı çıkarılır.
Şimdi HashSet sınıfının sahip olduğu bir takım metotları kullanarak bir örnek uygulama yapalım.
HashSetExample.java
package collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class HashSetExample {
public static void main(String[] args) {
// 1-HashSet'i oluşturma
Set<String> names = new HashSet<>();
Set<String> otherSet = new HashSet<>();
Set<String> otherSet2 = new HashSet<>();
// 2-HashSet'e veri ekleme
names.add("Alper Akalın");
names.add("Enes Gönez");
names.add("Nihat Gülşen");
otherSet.add("Osman Doğan");
otherSet.add("Hüsnü Tapan");
otherSet.add("Ramazan Haber");
otherSet2.add("Hüsnü Tapan");
otherSet2.add("Ramazan Haber");
otherSet2.add("Osman Doğan");
// 3-size kullanımı
System.out.println("Set'in Boyutu:"+names.size());
//Iterator Kullanımı
System.out.println("---Listedeki Elemenlar---");
Iterator<String> iterator = names.iterator();
while (iterator.hasNext()) {
String currentName = iterator.next();
System.out.println(currentName);
}
// 4-Contains Kullanımı
if(names.contains("Alper Akalın"))
System.out.println("---Alper Akalın listede mevcut!---");
// 5-isEmpty Kullanımı
if(!names.isEmpty())
System.out.println("---Liste Boş Değil!---");
// 6-addAll Kullanımı
names.addAll(otherSet);
System.out.println("---AddAll Metodu Çalıştıktan Sonra---");
names.forEach(e -> System.out.println(e));
// 7-removeAll kullanımı
names.removeAll(otherSet);
System.out.println("---RemoveAll Metodu Çalıştıktan Sonra---");
names.forEach(e -> System.out.println(e));
// 8-equals Kullanımı
System.out.println("---equals Kullanımı---");
System.out.print("names Set'i otherSet'e eşit mi?");
if(names.equals(otherSet))
{
System.out.println("Evet");
}
else
{
System.out.println("Hayır");
}
System.out.print("otherSet Set'i otherSet2'ye eşit mi?");
if(otherSet.equals(otherSet2))
{
System.out.println("Evet");
}
else
{
System.out.println("Hayır");
}
// 9-Clear Kullanımı
names.clear();
System.out.println("---Clear Metodu Çalıştıktan Sonra---");
names.forEach(e -> System.out.println(e));
}
}
Java kodumuz içinde birinci aşamada HashSet örneğinin elde edilişini görüyoruz.
-
aşamada add() metodu ile veri eklenişini görüyoruz.
-
aşamada size() metodu ile Set’deki eleman sayısını öğreniyoruz.
-
aşamada HashSet sınıfı içindeki iterator() metodunu kullanarak bir iterator instance’ı elde ediyoruz ve onunla Set üzerinde dolanarak Set’deki verileri ekrana yazdırıyoruz.
-
aşamada contains() metodu ile aranan değerin listede olup olmadığına bakıyoruz.
-
aşamada isEmpty() metodu ile liste boş mu değil mi ona bakıyoruz.
-
aşamada addAll() metodunun kullanımını örnekliyoruz. Bu metot bir Collection’daki verileri bir kerede bizim Collection’ımıza ekler.
-
aşamada removeAll() metodunun kullanımını örnekliyoruz. Bu metot bir Collection’daki verileri bir kerede bizim Collection’ımızdan siler.
-
aşamada iki Set’in eşit olup olmadığına bakıyoruz. Yalnız dikkat ederseniz otherSet ve otherSet2 aynı değerleri tutmasına karşın ekleniş sırası farklı. Burada Set’e elemanların ekleniş sırası önemli değildir. Sadece aynı öğeleri tutuyor olmaları eşit olmaları için yeterlidir.
-
aşamada clear() kullanımına değiniyoruz ve bir defada tüm liste boşaltılıyor.
Ekran Çıktısı
[]
Bu yazıda HashSet sınıfını inceledik arkadaşlar. Gelecek yazıda TreeSet sınıfını inceleyeceğiz. Görüşene kadar sağlıcakla kalın. Selam ve Sevgilerimle.
Kaynaklar:
https://docs.oracle.com/javase/8/docs/api/java/util/HashSet.html
http://www.baskent.edu.tr/~tkaracay/etudio/ders/prg/dataStructures/Collections/ClassHashMap.pdf