CodeGym /Java Blogu /Rastgele /HashMap: Bu ne tür bir harita?
John Squirrels
Seviye
San Francisco

HashMap: Bu ne tür bir harita?

grupta yayınlandı
MERHABA! Bu derste, Java HashMap'i daha yakından inceleyeceğiz . Daha önce, öğelerin kendileri olarak depolandığı veri yapılarını inceledik. Bir dizide veya bir ArrayList / LinkedList'te , belirli sayıda öğe saklarız. Peki ya görevimiz biraz değişirse?
HashMap: Bu ne tür bir harita?  - 1
Şu görevi hayal edin: her kişinin adını ve pasaport numarasını saklayan 100 kişilik bir liste oluşturun. Prensip olarak, bu o kadar da zor değil. Örneğin, her ikisini de bir dizeye doldurabilir ve ardından şu dizelerin bir listesini oluşturabilirsiniz: "Amelia Aguilar, 4211 717171". Ancak bu çözümün iki dezavantajı vardır. İlk olarak, pasaport numarasına göre arama yeteneğine ihtiyacımız olabilir. Ve bu bilgi depolama formatı göz önüne alındığında bu sorunlu olacaktır. İkincisi, hiçbir şey bizi aynı pasaport numarasına sahip iki farklı insan yaratmaktan alıkoyamaz. Bu da bizim çözümümüzün en ciddi eksikliği. Buna asla izin verilmemelidir: iki kişi aynı pasaport numarasına sahip değildir. Yeni bir veri yapısı imdadımıza yetişiyor: Harita. Aynı zamanda bir "ilişkisel dizi" olarak da bilinir, ancak bu terim nadiren kullanılır. Daha yaygın olarak "sözlük" veya "harita" olarak adlandırılır. :) Daha önce ele aldığımız veri yapılarından temel olarak ne kadar farklı? Her şeyden önce, bir Haritadaki verilerin anahtar-değer çiftleri olarak saklanması gerçeğinde. Her şey anahtar ve değer işlevi görebilir: sayılar, dizeler veya diğer sınıfların nesneleri. Bugün, Map sınıfının en yaygın uygulamasını inceleyeceğiz : Java HashMap . HashMap: Bu ne tür bir harita?  - 2

Peki, Java'daki HashMap hakkında bilmemiz gerekenler nelerdir?

Oluşturmak çok kolaydır:

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();
}
Burada öğeleri "sayı-dizgisi" çiftleri olarak saklayan bir sözlük oluşturuyoruz. Sayı anahtar, dize ise değer olarak işlev görür. Ayrıca anahtar tipini (Tamsayı) ve değer tipini (String) belirtiyoruz. Neden? İlk olarak, bir HashMap anahtarı her zaman benzersizdir. Pasaport numarasını anahtar olarak kullanabildiğimiz ve kopyaları önleyebildiğimiz için bu bize çok uygun. Değer, tam ada sahip bir dize olacaktır (farklı kişiler aynı ada sahip olabilir; bu bizim için endişelenecek bir şey değil). HashMap'e yeni bir çift eklemek şöyle görünür:

public class Main {

   public static void main(String[] args) {
       HashMap<Integer, String> passportsAndNames = new HashMap<>();

       passportsAndNames.put (212133, "Bridget Logan");
       passportsAndNames.put (162348, "Ivan the Great");
       passportsAndNames.put(8082771, "Donald John Trump");
       System.out.println(passportsAndNames);
   }
}
Bunun için put() yöntemini kullanıyoruz . Ek olarak, HashMap toString() yöntemini geçersiz kılar , böylece konsolda görüntülenebilir. Çıktı şu şekilde görünecektir: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=İvan the Great} Şimdi anahtarların gerçekten benzersiz olup olmadığını doğrulayalım. Haritada zaten kullanılmış olan bir anahtarla yeni bir öğe eklemeyi deneyelim :

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");
   passportsAndNames.put(162348, "Albert Kent");// This key has already been used
   System.out.println(passportsAndNames);
}
Çıktı: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Albert Kent} Gördüğünüz gibi, 162348 anahtarıyla ilişkili önceki değerin üzerine yazıldı. "Anahtar" terimini bir nedenle kullanıyoruz. Bir HashMap'teki değerlere anahtar kullanılarak erişilir, ancak bunun tersi mümkün değildir. Değerler benzersiz olmayabileceğinden anahtar, bir değer kullanılarak elde edilemez. HashMap'ten bir öğe alınırken veya kaldırılırken bu açıkça görülebilir :

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   String lidiaName = passportsAndNames.get(212133);
   System.out.println(lidiaName);

   passportsAndNames.remove(162348);
   System.out.println(passportsAndNames);
}
Bir değeri almak veya sözlükten bir çifti kaldırmak için, değere karşılık gelen benzersiz anahtarı get() ve remove() işlevine iletmeliyiz. Dizilerin ve listelerin aksine, Java'daki bir HashMap'in sayısal indeksleri yoktur: değerlere anahtar kullanılarak erişilir. Konsol çıktısı: Bridget Logan {212133=Bridget Logan, 8082771=Donald John Trump} ArrayList ve LinkedList sınıfları, listenin belirli bir öğe içerip içermediğini kontrol etmemizi sağlar . Java HashMap bunu yapmamıza izin verir. Dahası, bunu çiftin her iki üyesi için de yapabiliriz: includeKey () (anahtar olup olmadığını kontrol eder) ve includeValue() budur(bir değer için kontroller) yöntemleri içindir.

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.containsKey(11111));
   System.out.println(passportsAndNames.containsValue("Donald John Trump"));
}
Çıktı: false true Java'daki HashMap'in bir başka kullanışlı özelliği de, tüm anahtarların ve tüm değerlerin ayrı listelerini alabilmenizdir. Bu, keySet() ve values() yöntemleriyle gerçekleştirilir :

public class Main {

   public static void main(String[] args) {
       HashMap<Integer, String> passportsAndNames = new HashMap<>();

       passportsAndNames.put (212133, "Bridget Logan");
       passportsAndNames.put (162348, "Ivan the Great");
       passportsAndNames.put(8082771, "Donald John Trump");

       Set keys = passportsAndNames.keySet();
       System.out.println("Keys: " + keys);

       ArrayList<String> values = new ArrayList<>(passportsAndNames.values());
       System.out.println("Values: " + values);
   }
}
Anahtarlar , henüz ele almadığımız bir Set içine çıkarılır . Yinelenen öğeler içermemesi bakımından özeldir. Şimdi asıl önemli olan, tüm anahtarların listesinin bir HashMap'ten ayrı bir koleksiyona alınabileceğini hatırlamaktır . Örnekte, değerleri sıradan bir ArrayList'e kaydettik . Konsol çıktısı: Anahtarlar: [212133, 8082771, 162348] Değerler: [Bridget Logan, Donald John Trump, Ivan the Great] size () ve clear() yöntemleri, tartıştığımız önceki yapılarda olduğu gibi tamamen aynı şeyi yapar: ilki sözlükte bulunan öğelerin sayısını döndürür, ikincisi tüm öğeleri kaldırır.

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.size());
   passportsAndNames.clear();
   System.out.println(passportsAndNames);
}
Çıktı: 3 {} HashMap'imizde en az bir öğe olup olmadığını kontrol etmek için isEmpty() yöntemini kullanabiliriz :

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   if (!passportsAndNames.isEmpty()) {

       System.out.println(passportsAndNames);
   }
}
Çıktı: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan the Great} Artık konsola yalnızca bir ön kontrolden sonra çıktı vereceğiz. :) Bir başka ilginç nokta da iki Haritanın birleştirilebilir olmasıdır. Bu, putAll() yöntemi kullanılarak gerçekleştirildi . Bunu ilk HashMap'te çağırıyoruz , ikinciyi bir argüman olarak iletiyoruz ve ikinciden gelen öğeler birinciye ekleniyor:

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();
   HashMap<Integer, String> passportsAndNames2 = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   passportsAndNames2.put(917352, "Clifford Patrick");
   passportsAndNames2.put(925648, "Mitchell Salgado");

   passportsAndNames.putAll(passportsAndNames2);
   System.out.println(passportsAndNames);
}
Çıktı: {917352=Clifford Patrick, 212133=Bridget Logan, 8082771=Donald John Trump, 925648=Mitchell Salgado, 162348=İvan the Great} pasaportlarAndİsim2 içindeki tüm çiftler pasaportlarAndİsimler klasörüne kopyalandı . Şimdi daha karmaşık bir örnek düşünün. Spesifik olarak, bir HashMap üzerinde bir döngüde yineleme .

for (Map.Entry<Integer, String> entry: passportsAndNames.entrySet()) {
   System.out.println(entry);
}
Map.Entry sınıfı , sözlük içindeki anahtar/değer çiftini belirtir. entrySet () yöntemi, HashMap'teki tüm çiftlerin bir listesini döndürür . Haritamız bu Map.Entry çiftlerinden oluştuğu için, ayrı anahtarlar veya değerler üzerinden değil, çiftler üzerinden yineliyoruz. Çıktı: 212133=Bridget Logan 8082771=Donald John Trump 162348=Büyük İvan Ayrıca HashMap için resmi Oracle belgelerini incelemeyi unutmayın .
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION