1. Bir dizi anahtar/değer çifti.

Bir dizi anahtar/değer çifti

Java'da, başka bir ilginç koleksiyon (geniş anlamda) Map. Bazen bu veri yapısına sözlük de denir.

Koleksiyona benzer Set, ancak bir dizi öğe yerine bir dizi öğe "çifti" depolar. a'daki her bir çift Mapiki öğeden oluşur: bir "anahtar" ve bir "değer".

Diyelim ki programınızın çalışan adlarını ve maaşlarını veya iş arkadaşlarınızın adlarını ve yaşlarını saklamasını istiyorsunuz. O zaman şöyle bir tabloya ihtiyacınız olacak:

İsim Yaş
Elon 21
Jeff 22
Fatura 48
Warren ?

Her satır birkaç değer içerir. Adı çiftin anahtarı olarak ve yaşı çiftin değeri olarak anacağız .

Bu çiftlerin tamamı bizim haritamızdır ( Map).

Bir çiftin anahtarı dışında herhangi bir şey olabilir null. Anahtarlar benzersiz olmalıdır: bir harita iki özdeş anahtar içeremez.


2. HashMapsınıf

Sınıf HashMap, en popüler koleksiyon türüdür Map. Bir yandan HashSet'e çok benzer ve tüm yöntemlerine sahiptir. ArrayListÖte yandan, indeksleri olarak sözcükleri (veya başka herhangi bir şeyi) kullanabilen bir liste ( ) gibidir .

HashMapBunun gibi bir ifadeyi kullanarak oluşturabilirsiniz :

HashMap<KeyType, ValueType> name = new HashMap<KeyType, ValueType>();

KeyTypeDepolanan çiftlerdeki anahtarların türü ve ValueTypekoleksiyonda depolanan çiftlerdeki değerlerin türü nerede HashMap.

Sınıfın HashMapaşağıdaki gibi yöntemleri vardır:

Yöntem Tanım
void put(KeyType key, ValueType value)
( key, value) çiftini koleksiyona ekler
ValueType get(KeyType key)
Bir anahtarla ilişkili değeri döndürür.
boolean containsKey(KeyType key)
Koleksiyonda bir anahtarın olup olmadığını kontrol eder
boolean containsValue(ValueType value)
Koleksiyonda bir değerin varlığını kontrol eder
ValueType remove(KeyType key)
Koleksiyondan bir öğeyi kaldırır
void clear()
Tüm öğeleri kaldırarak koleksiyonu temizler
int size()
Koleksiyondaki anahtar/değer çiftlerinin sayısını döndürür
Set<KeyType> keySet()
Koleksiyondaki anahtar kümesini döndürür
Collection<ValueType> values()
Koleksiyonun öğelerini içeren bir küme döndürür
Set<Map.Entry<KeyType, ValueType>> entrySet()
Koleksiyondaki Settüm çiftlerin ( ) kümesini ( ) döndürür .Map.Entry

Bir öğeye öğe eklemeHashMap

Öğeler, yöntem kullanılarak bir haritaya çiftler halinde eklenir put(). Anahtar ilk bağımsız değişken olarak iletilir ve değer ikinci olarak iletilir.

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);

Bir anahtar/değer çifti eklerken, anahtar koleksiyonda zaten varsa eski değer yeni değerle değiştirilir.

Bu davranış, indeksleri sayılar yerine HashMapkelimeler ( ) olan bir dizi veya liste yapar.String

Önemli:

Hemen hemen her tür KeyType veya ValueType olabilir. KeyType için bazı küçük ek gereksinimler vardır ve Java Collections görevinde koleksiyonları daha ayrıntılı olarak incelediğinizde bunları öğreneceksiniz.



3. a'nın alt kümeleri HashMap: anahtar kümesi

HashMapDiyelim ki a içindeki tüm girişleri ekranda görüntülemek istiyoruz . Bunu nasıl yapabiliriz? Bunu yapmak için, HashMap. Bu birkaç yolla yapılabilir.

En kolay yol, tuşların üzerinden geçmektir.

HashMapgirişler sırayla numaralandırılmaz, bu nedenle sayaçlı bir döngü burada çalışmaz. Ancak, yöntemi kullanarak bir dizi anahtar elde edebiliriz keySet()ve zaten bir dizi üzerinde nasıl yineleme yapacağınızı biliyorsunuz:

kod Tanım
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);

for (String key: map.keySet())
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}






map

Anahtarla ilişkili değeri al'ın anahtarları üzerinde döngü yapın

Yöntem keySet()bir dizi anahtar döndürür. Bu seti iki şekilde kullanabilirsiniz:

Kompakt notasyon Uzun gösterim
for (String key: map.keySet())
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}
Set<String> keys = map.keySet();

for (String key: keys)
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}


4. Anahtar-değer çiftleri üzerinde döngü

MapDaha karmaşık bir yol da var: a'yı bir anahtar/değer çiftleri kümesine dönüştürebilir ve daha önce öğrendiğimiz gibi, kümenin öğeleri üzerinde döngü yapabilirsiniz.

Koleksiyon, HashMapbir anahtar/değer çiftini depolayan bir yardımcı sınıfa sahiptir. Yaklaşık olarak şuna benziyor:

class Entry<KeyType, ValueType>
{
   private KeyType key;
   private ValueType value;

   public KeyType getKey()
   {
      return this.key;
   }

   public ValueType getValue()
   {
      return this.value;
   }
}

entrySet()Yöntemi bir nesne üzerinde çağırmanın sonucu şöyle olacaktır :HashMap<KeyType, ValueType>Set<Entry<KeyType, ValueType>>

Set<Entry<KeyType, ValueType>> name = map.entrySet();

Burada, bir tür parametresine sahip genel sınıfa sahibiz Set, bu da Entryiki tür parametreye sahip genel bir tür ( ) olur.

Yeni başlayan birinin bu konuda kafası karışması çok kolaydır. Ancak bir kez anladığınızda, şöyle bir kod yazabilirsiniz:

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);

Set<Map.Entry<String, Integer>> entries = map.entrySet();
for(Map.Entry<String, Integer> pair: entries)
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

Bununla birlikte, bu kod biraz basitleştirilebilir:

Öncelikle, for için ayrı bir değişken oluşturmayı atlayabilir entriesve bunun yerine entrySet()yöntemi doğrudan fordöngünün içinden çağırabilirsiniz:

for(Map.Entry<String, Integer> pair: map.entrySet())
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

İkinci olarak, anahtar/değer çiftininvar türünü otomatik olarak anlamak için yakın zamanda tanıtılan işleci kullanabilirsiniz :

for(var pair: map.entrySet())
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

Fena değil, ha?



5. Karşılaştırma ArrayListveHashMap

A, dizelerin (veya diğer türlerin) dizinler (anahtarlar) olarak kullanılmasına izin veren HashMapan'a çok benzer .ArrayList

Integera'daki anahtarlar için kullanırsanız HashMap, a'ya daha da benzer hale gelir ArrayList. Hadi karşılaştıralım:

ArrayList<String> ile Kodlama HashMap<Integer, String> ile kodlayın
ArrayList<String> list = new ArrayList<String>();

list.add("Greetings");
list.add("Hello");

String s = list.get(0);
list.set(0, s + "!");

for (String item: list)
{
   System.out.println(item);
}
HashMap<Integer, String> map = new HashMap<Integer, String>();

map.put(0, "Greetings");
map.put(1, "Hello");

String s = map.get(0);
map.put(0, s + "!");

for (String item: map.values())
{
   System.out.println(item);
}