Bir Map anahtar-değer çiftlerini saklar
Bir HashMap (java.util'den) ilişkilendirmeleri saklar: her anahtar bir değere eşlenir ve değerleri anahtarlarıyla yaklaşık olarak sabit zamanda ararsınız. Bir sözlük düşünün: kelime anahtardır, tanım ise değerdir.
İki tür parametresi <KeyType, ValueType> şeklindedir. Burada anahtarlar String, değerler ise Integer'dır. ArrayList'te olduğu gibi, değişkeni genellikle Map arabirimi türüyle tanımlar ve bir HashMap oluşturursunuz.
put, get ve üzerine yazma
İçselleştirilmesi gereken iki şey:
- Bir anahtar benzersizdir. Var olan bir anahtarla
put, değerini değiştirir ve eski değeri döndürür. - Olmayan bir anahtarda
get, hata değilnulldöndürür. Bunull'ı otomatik olarak birint'e açmak (auto-unboxing)NullPointerExceptionfırlatır ki bu yaygın bir hata kaynağıdır.
getOrDefault null tuzağından kaçınır
Her seferinde null kontrolü yapmak yerine bir varsayılan değer isteyin:
Bu, "belki vardır" türündeki aramaları ele almanın en temiz yoludur ve doğrudan en ünlü HashMap kalıbına götürür.
Tekrarları sayma
Her öğenin kaç kez göründüğünü saymak, bir HashMap için ders kitabı görevidir:
map.put(key, map.getOrDefault(key, 0) + 1) kalıbı "mevcut sayıyı (ya da sıfırı) al, bir ekle ve geri yaz" şeklinde okunur. Daha düzenli bir eşdeğeri counts.merge(word, 1, Integer::sum)'dur.
Kontrol etme ve kaldırma
putIfAbsent(key, value) yalnızca anahtar yoksa yazar; tembel başlatma için kullanışlıdır.
Bir HashMap üzerinde döngü
En yaygın döngü entrySet() üzerinde dolaşarak her anahtar ve değeri birlikte verir:
Yalnızca anahtarlara ya da yalnızca değerlere ihtiyacınız varsa:
Ayrıca bir lambda ile forEach de kullanabilirsiniz: ages.forEach((name, age) -> System.out.println(name + ": " + age));.
HashMap sırayı korumaz
Bir HashMap herhangi bir yineleme sırası garantisi vermez: bu sıra, hash'lemenin ürettiği şeydir ve çalıştırmalar arasında değişebilir. Öngörülebilir bir sıraya ihtiyacınız varsa:
LinkedHashMapekleme sırasını korur.TreeMapanahtarları doğal sıralamaya göre (ya da sağladığınız birComparator'a göre) sıralı tutar.
Üçü de Map arabirimini uygular, bu yüzden birinden diğerine geçmek yapıcıda tek satırlık bir değişikliktir.
Anahtarlar hash'lenebilir olmalıdır
HashMap girdileri anahtarı hash'leyerek bulur, bu yüzden bir anahtarın hashCode() ve equals() metotları birbiriyle tutarlı olmalıdır. String ve Integer gibi yerleşik türler bunu zaten doğru yapar. Kendi sınıfınızı anahtar olarak kullanırsanız, hem equals hem de hashCode'u geçersiz kılın; aksi takdirde anlam olarak "eşit" olan iki nesne farklı kovalara düşer ve aramalarınız esrarengiz bir şekilde başarısız olur.
Sırada: HashSet
Bir HashMap "bu anahtar altında hangi değer saklanıyor?" sorusunu yanıtlar. Yalnızca bir şeyin var olup olmadığıyla ilgilendiğinizde (ilişkili veri olmaksızın, benzersiz değerlerden oluşan bir küme), kullanacağınız araç HashSet'tir ve sırada o var.
Sıkça Sorulan Sorular
Java'da HashMap nasıl oluşturulur?
İki tür parametresiyle (anahtar türü ve değer türü) tanımlayın ve yapıcıyı çağırın: Map<String, Integer> ages = new HashMap<>();. Ardından ages.put("Ada", 36); ile girdi ekleyin ve ages.get("Ada"); ile okuyun. java.util.HashMap ve java.util.Map paketlerini içe aktarın.
Java'da bir HashMap üzerinde nasıl döngü kurulur?
Her anahtar ve değeri birlikte almak için map.entrySet() üzerinde for-each döngüsüyle dolaşın: for (Map.Entry<String, Integer> e : map.entrySet()) { ... }, ardından e.getKey() ve e.getValue() ile okuyun. Yalnızca anahtarlar için map.keySet() üzerinde ya da yalnızca değerler için map.values() üzerinde de dolaşabilirsiniz. HashMap'in ekleme sırasını korumadığını unutmayın.
get ile getOrDefault arasındaki fark nedir?
get(key) bir anahtarın değerini döndürür; anahtar yoksa null döndürür ki bu, sonucu doğrudan kullanırsanız NullPointerException'a yol açabilir. getOrDefault(key, fallback) varsa değeri döndürür, yoksa verdiğiniz varsayılan değeri döndürür; böylece null kontrolünden kurtulursunuz. Özellikle sayma işlemlerinde kullanışlıdır: counts.put(c, counts.getOrDefault(c, 0) + 1).