Set interface'de sadece Collection sınıfından miras aldığı metodlar vardır.
Bu metodlara aynı elemandan birden fazla bulundurmama şartını ilave etmiştir.
İki setin eşit olması için tamamen aynı aynı elemanları içermeleri gerekir.
Java platformu Set interface'inin HashSet, TreeSet ve LinkedHashSet implementasyonlarını bulundurur.
1. HashSet
Tanımı:
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, Serializable
Elemanlarını hash table'da barındırır.
En performanslı olan set implementasyonu budur.
2. TreeSet
Tanımı:
public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, Serializable
Elemanlarını red-black tree'de barındırır.
Değerlere göre sıralama yapar.
Performansı daha düşüktür.
3. LinkedHashSet :
SortedSet interface'ini implement eder.
HashSet'in alt sınıfıdır.
Linked list içeren bir hash table'dan ibarettir.
elemanları eklenme sırasına göre sıralar.
Bir setin sıralama yapmasını, fakat HashSet gibi de performanslı olmasını istediğimiz zaman kullanabiliriz.
Performansı HashSet'e göre çok az düşüktür.
Örnekler
Diyelim ki elimizde bir Collection olan "sehirler" var ve bunun içindeki kopyaları (aynı elemandan birden fazla olanları) silmek istiyoruz.
...ArrayList<String> sehirler = new ArrayList<>(); sehirler.add("istanbul"); sehirler.add("ankara"); sehirler.add("izmir"); sehirler.add("istanbul"); sehirler.add("ankara"); Collection<String> tekSehirler = new HashSet<String>(sehirler);output: [ankara, izmir, istanbul]
Burada tek satırda c'yi bir HashSet'e dönüştürerek conversion constructor aracılığıyla kopyalardan da kurtulmuş oluyoruz.
Sıranın değişmesini istemiyorsak HashSet yerine LinkedHashSet kullanabiliriz.
JDK 8+ için aggregate operasyonları kullanarak dönüştürebiliriz:
...Set s = cities.stream().collect(Collectors.toSet()); System.out.println(s);output: [ankara, izmir, istanbul]
Ya da bir TreeSet' e dönüştürebiliriz:
...Set<String> set = cities.stream() .map(Object::toString) .collect(Collectors.toCollection(TreeSet::new)); System.out.println(set);output: [ankara, istanbul, izmir]
Hiç yorum yok:
Yorum Gönder