JavaRush /Java Blogu /Random-AZ /Java-da HashMap - bu hansı xəritədir?

Java-da HashMap - bu hansı xəritədir?

Qrupda dərc edilmişdir
Salam! Bu gün başqa bir məlumat strukturu - Xəritə haqqında danışacağıq. Rəsmi rusca adı "assosiativ massiv"dir, lakin tez-tez istifadə edilmir. Daha çox yayılmış variantlar "lüğət", "xəritə" və ya (ən çox) jarqon anglicism "xəritə"dir :) Xəritə daxilində məlumatlar "açar" - "dəyər" formatında, yəni cüt-cüt saxlanılır. Həm açarlar, həm də dəyərlər istənilən obyekt ola bilər - nömrələr, sətirlər və ya digər siniflərin obyektləri.

Xəritə digər məlumat strukturlarından nə ilə fərqlənir

Əvvəllər elementlərin özləri tərəfindən saxlandığı məlumat strukturlarına baxdıq. Massivdə və ya ArrayList / LinkedList , biz müəyyən sayda element saxlayırıq. Bəs vəzifəmiz bir az dəyişsə nə olacaq? Məsələn, təsəvvür edin ki, qarşımızda şəxsin tam adı və pasport nömrəsinin saxlanacağı 100 nəfərlik siyahı yaratmaq vəzifəsi var. Prinsipcə, bu o qədər də çətin deyil. Məsələn, hər ikisini bir sətirdə yerləşdirə və belə sətirlərin siyahısını yarada bilərsiniz: "Anna İvanovna Reshetnikova, 4211 717171." Ancaq bu həllin iki çatışmazlığı var. Birincisi, bizə pasport axtarış funksiyası lazım ola bilər. Və məlumatın saxlanması üçün bu formatla bu problemli olacaq. İkincisi, eyni pasport nömrələri ilə iki fərqli insan yaratmağımıza heç nə mane olmayacaq. Və bu, həllimizin ən ciddi çatışmazlığıdır. Belə hallar tamamilə istisna edilməlidir, eyni pasport nömrəsi olan iki nəfər yoxdur. Burada Xəritə və onun qeyd olunan xüsusiyyətləri bizə kömək edir (məlumatların “açar”-”dəyər” formatında cütlükdə saxlanması). Ən çox yayılmış Xəritə tətbiqinə - Java HashMap sinfinə baxaq .HashMap - bu hansı xəritədir?  - 1

Java-da HashMap yaratmaq və siniflə işləmək

Bu tətbiqi yaratmaq çox sadədir:
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

}
Burada elementlərin “nömrə-sətir” formatında saxlanacağı lüğət yaratdıq. Rəqəm açar, sətir isə dəyər olacaq. Hansı növ açarların olacağımızı da göstərdik ( Integer) və hansı növ dəyərlər ( String). Bu niyə belədir? Birincisi, HashMap-dakı açar həmişə unikaldır . Bu, bizim üçün əla işləyəcək, çünki biz pasport nömrəsini açar kimi istifadə edə bilərik və dublikatlardan qaça bilərik. Tam adı olan sətir isə dəyər rolunu oynayacaq (müxtəlif insanların tam adı asanlıqla təkrarlana bilər, bunun bizim üçün heç bir problemi yoxdur).

HashMap-a yeni cüt əlavə edilir

Bu tapşırıq belə görünür:
public class Main {

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


       passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
       passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
       passportsAndNames.put(8082771, "Donald John Trump");
       System.out.println(passportsAndNames);

   }

}
Bunun üçün metoddan istifadə olunur put(). Bundan əlavə, HashMap-ın ləğv edilmiş metodu var toString()ki, onu konsolda çap etmək mümkün olsun. Çıxış belə görünəcək: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald Con Tramp, 162348=İvan Mixayloviç Serebryakov}

HashMap Açarlarının xüsusiyyətləri

İndi açarların həqiqətən unikal olub olmadığını yoxlayaq? Artıq xəritədə olan açarı olan yeni element əlavə etməyə çalışaq :
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");
   passportsAndNames.put(162348, "Viktor Mikhailovich Stychkin");//repeat key

   System.out.println(passportsAndNames);

}
Nəticə: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald Con Tramp, 162348=Viktor Mixayloviç Stıçkin} Gördüyünüz kimi 162348 açarı olan əvvəlki elementin üzərinə yazılmışdır. "Açar" bir səbəbə görə açar adlandırıldı. HashMap-dakı dəyərlərə açarla daxil olur (lakin əksinə deyil - açar dəyərlə əldə edilə bilməz, çünki dəyərlər təkrarlana bilər). Bu elementin alınması, eləcə də HashMap-dan elementin çıxarılması nümunələrində aydın görünür:
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

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


   passportsAndNames.remove(162348);
   System.out.println(passportsAndNames);

}
Lüğətdən bir dəyər əldə etmək və ya cütü silmək üçün bu dəyərə uyğun olan unikal açarı get()metodlara tam olaraq ötürməliyik. HashMap-da massivlərdə və ya siyahılarda olduğu kimi ədədi indekslər yoxdur - dəyərə açarla daxil olur. Konsol çıxışı: Lidiya Arkadyevna Bublikova {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald Con Tramp}remove()

Açarın və dəyərin mövcudluğunun yoxlanılması

ArrayListLinkedList siniflərində siyahıda müəyyən elementin olub-olmadığını yoxlaya bilərik. HashMap də bunu etməyə imkan verir və cütün hər iki hissəsi üçün: onun üsulları var containsKey()(açarın mövcudluğunu yoxlayır) və containsValue()(dəyərin mövcudluğunu yoxlayır).
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");


   System.out.println(passportsAndNames.containsKey(11111));
   System.out.println(passportsAndNames.containsValue("Donald John Trump"));

}
Nəticə: yalan doğru

Bütün açarların və dəyərlərin siyahısını əldə etmək

HashMap-ın digər əlverişli xüsusiyyəti ondan ibarətdir ki, siz ayrıca bütün açarların və bütün dəyərlərin siyahısını əldə edə bilərsiniz . Bunun üçün üsullar keySet()və istifadə olunur values():
public class Main {

   public static void main(String[] args) {

       HashMap<Integer, String> passportsAndNames = new HashMap<>();

       passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
       passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
       passportsAndNames.put(8082771, "Donald John Trump");

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

       ArrayList<String> values = new ArrayList<>(passportsAndNames.values());
       System.out.println("Values: " + values);

   }

}
Açarlar kolleksiyaya çıxarılır Set. Onun özəlliyi ondadır ki, tərkibində təkrarlanan elementlər ola bilməz. İndi yadda saxlamaq lazım olan əsas odur ki, bütün açarların siyahısını HashMap-dan ayrı bir kolleksiyaya çıxarmaq olar. Nümunədə dəyərləri normal olaraq saxladıq ArrayList. Konsol çıxışı: Açarlar: [212133, 8082771, 162348] Dəyərlər: [Lidiya Arkadyevna Bublikova, Donald Con Tramp, İvan Mixayloviç Serebryakov] Metodlar keçdiyimiz əvvəlki strukturlarda olduğu kimi eynidir: birincisi bir sıra elementləri qaytarır size(). clear()cari anda lüğət, ikincisi bütün elementləri silir.
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.size());
   passportsAndNames.clear();
   System.out.println(passportsAndNames);

}
Nəticə: 3 {} HashMap-imizdə ən azı bir elementin olub-olmadığını yoxlamaq üçün metoddan istifadə edə bilərik isEmpty():
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   if (!passportsAndNames.isEmpty()) {

       System.out.println(passportsAndNames);

   }

}
Çıxış: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=İvan Mixayloviç Serebryakov} İndi biz yalnız ilkin yoxlamadan sonra konsola çıxacağıq :)

İki xəritənin birində birləşdirilməsi

Digər maraqlı məqam odur ki, iki xəritə birləşdirilə bilər . Bunun üçün bir üsul var putAll(). Biz onu birinci HashMap- da çağırırıq , ikincisini arqument kimi ötürürük və ikincinin elementləri birinciyə əlavə olunacaq:
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();
   HashMap<Integer, String> passportsAndNames2 = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   passportsAndNames2.put(917352, "Alexey Andreevich Ermakov");
   passportsAndNames2.put(925648, "Maxim Olegovich Arkharov");


   passportsAndNames.putAll(passportsAndNames2);
   System.out.println(passportsAndNames);

}
Nəticə: {917352=Aleksey Andreeviç Ermakov, 212133=Lidiya Arkadyevna Bublikova, 8082771=Donald Con Tramp, 925648=Maksim Oleqoviç Arxarov, 162348=İvan Mixayloviç Serebryakov pasportu} bütün elementləri ilə birlikdə pasportlara daxil edilmişdir . İndi daha mürəkkəb bir nümunəyə baxaq. Yəni, bir döngədə HashMap üzərində təkrarlayın.
for (Map.Entry entry: passportsAndNames.entrySet()) {

   System.out.println(entry);

}
İnterfeys Map.Entrysadəcə lüğət daxilində açar-dəyər cütlüyü deməkdir. Metod entrySet()HashMap-imizdəki bütün cütlərin siyahısını qaytarır (xəritəmiz məhz belə Giriş cütlərindən ibarət olduğundan, biz açarlar və ya dəyərləri ayrı-ayrılıqda deyil, cütlər üzərində təkrarlayırıq). Nəticə: 212133=Lidiya Arkadyevna Bublikova 8082771=Donald Con Tramp 162348=İvan Mixayloviç Serebryakov Bu məqaləni gələcək üçün saxla: https://habr.com/ru/post/128017/ İndi onu oxumaq tezdir, amma gələcəkdə , HashMap-dən istifadə etməyə başladığınız zaman bu məlumat strukturunun içəridən necə işlədiyini anlamağa kömək edəcək. Həmçinin, HashMap-də rəsmi Oracle sənədlərini yoxlamağı unutmayın .
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION