Bir Küme Benzersiz Değerleri Saklar
Bir HashSet (java.util paketinden) her değeri en fazla bir kez tutan bir koleksiyondur. HashMap'teki gibi eşleştirilmiş anahtarlar ve değerler yoktur; yalnızca farklı elemanlardan oluşan bir torba vardır. Tek işi bir soruyu hızlıca yanıtlamaktır: "bu şey burada mı?"
Tek bir tip parametresi vardır, <ElementType>. ArrayList ve HashMap'te olduğu gibi, değişkeni genellikle Set arayüzü tipiyle tanımlar ve bir HashSet oluşturursunuz.
add, Değerin Yeni Olup Olmadığını Döndürür
add yalnızca değeri saklamakla kalmaz; kümenin gerçekten değişip değişmediğini söyleyen bir boolean döndürür. Zaten var olan bir değeri eklemek false döndürür ve kümeyi olduğu gibi bırakır.
Bu dönüş değeri gerçekten kullanışlıdır: if (!seen.add(x)) { /* x bir tekrar */ } ilerlerken yinelenenleri tek satırda tespit etmenizi sağlar.
Bir Listeden Yinelenenleri Kaldırma
Bir küme tekrarları reddettiği için, bir koleksiyondaki yinelenenleri temizlemenin en hızlı yolu onu bir kümeye boşaltmaktır. HashSet yapıcısı başka herhangi bir koleksiyonu kabul eder:
Bu, yeni başlayanların bir kümeye başvurmasının en yaygın nedenidir. Yalnızca şunu bilin: bu gidiş dönüşte orijinal sırayı kaybedersiniz; sıra önemliyse LinkedHashSet kullanın (aşağıda ele alınıyor).
contains, remove ve size
Günlük işlemler diğer koleksiyonlarınkini yansıtır:
Bir ArrayList'e göre en büyük kazanım contains'tir. Bir liste bunu yanıtlamak için her elemanı dolaşmak zorundadır (O(n)); bir HashSet neredeyse doğrudan yanıta atlar (kabaca O(1)). Kendinizi bir döngü içinde list.contains(...) çağırırken bulduğunuzda, bu genellikle bir kümeye geçmenin işaretidir.
Küme İşlemleri: Birleşim, Kesişim, Fark
Kümeler onları birleştirdiğinizde parlar. Hangisinin hangisi olduğunu bildiğinizde yöntemler neredeyse günlük dil gibi okunur:
Asıl tuzak: addAll, retainAll ve removeAll üzerinde çağrıldıkları kümeyi değiştirir. Her örneğin önce a'yı taze bir HashSet'e kopyalamasının nedeni budur; aksi takdirde orijinalinizi yok edersiniz. Her sonuç için yeni bir küme oluşturun.
HashSet Sırayı Korumaz
HashMap gibi, bir HashSet de hiçbir yineleme sırası garantisi vermez ve sıra çalıştırmadan çalıştırmaya değişebilir. Öngörülebilirliğe ihtiyacınız varsa:
LinkedHashSetekleme sırasını, yani elemanları eklediğiniz sırayı korur.TreeSetelemanları doğal sıralamaya göre (ya da sağladığınız birComparator'a göre) sıralı tutar.
Üçü de Set arayüzünü uygular, dolayısıyla aralarında geçiş yapmak yapıcıda tek satırlık bir değişikliktir.
Elemanlar Hash'lenebilir Olmalı
Bir HashSet arka planda bir HashMap ile desteklenir, dolayısıyla aynı kural geçerlidir: elemanları onların hash'ini hesaplayarak bulur, bu da bir elemanın hashCode() ve equals() metotlarının uyumlu olması gerektiği anlamına gelir. String ve Integer gibi yerleşik tipler bunu zaten doğru yapar; yukarıda yinelenen "java" dizgelerinin doğru şekilde birleşmesinin nedeni budur. Kendi sınıfınızın örneklerini saklarsanız, hem equals hem de hashCode'u geçersiz kılın; aksi takdirde anlam olarak "eşit" olan iki nesne farklı kabul edilir ve contains ile yinelenen temizleme sessizce başarısız olur.
Sıradaki: Koleksiyonları Dolaşma
Artık üç ana koleksiyonla tanıştınız: ArrayList, HashMap ve HashSet. Her birinde biraz farklı dolaşırsınız ve ince tuzaklar vardır (bir koleksiyonu üzerinde döngü kurarken değiştirmek gibi). Sırada her şeyi bir araya getirecek ve koleksiyonları for-each döngüsü, yineleyiciler ve forEach ile temiz bir şekilde dolaşmayı ele alacağız.
Sıkça Sorulan Sorular
Java'da bir HashSet nasıl oluşturulur?
Tek bir tip parametresiyle (eleman tipi) tanımlayın ve yapıcıyı çağırın: Set<String> tags = new HashSet<>();. tags.add("java"); ile değer ekleyin ve tags.contains("java"); ile üyeliği test edin. java.util.HashSet ve java.util.Set paketlerini içe aktarın.
Java'da HashSet ile ArrayList arasındaki fark nedir?
Bir ArrayList, eklediğiniz her elemanı (yinelenenler dahil) ekleme sırasına göre tutar ve konuma göre indekslenir. Bir HashSet yalnızca benzersiz değerleri saklar, herhangi bir sıra garantisi vermez, indeksi yoktur ve contains kontrolü tüm listeyi taramak yerine kabaca sabit zamanlıdır. Konum değil de benzersizlik ya da hızlı üyelik önemliyse HashSet kullanın.
Java'da bir listeden yinelenenler nasıl kaldırılır?
Listeyi bir HashSet yapıcısına geçirin: Set<String> unique = new HashSet<>(list);. Küme, tekrar eden değerleri otomatik olarak atar. Tekrar bir listeye ihtiyacınız varsa (ve sırayı kaybetmeyi sorun etmiyorsanız) onu yeniden sarmalayın: new ArrayList<>(unique). Orijinal sırayı korumak istiyorsanız bunun yerine bir LinkedHashSet kullanın.