Menu

Java HashMap: put, get, döngü ve yaygın kalıplar

Java'nın HashMap'ini anahtar-değer aramaları için nasıl kullanırsınız: put, get, getOrDefault, containsKey, girdiler üzerinde döngü ve en sık başvuracağınız kalıplar.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

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ğil null döndürür. Bu null'ı otomatik olarak bir int'e açmak (auto-unboxing) NullPointerException fı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:

  • LinkedHashMap ekleme sırasını korur.
  • TreeMap anahtarları doğal sıralamaya göre (ya da sağladığınız bir Comparator'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).

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA