JavaRush /Java Blog /Random-TL /HashMap sa Java - anong uri ng mapa ito?

HashMap sa Java - anong uri ng mapa ito?

Nai-publish sa grupo
Kamusta! Ngayon ay pag-uusapan natin ang tungkol sa isa pang istraktura ng data - Mapa. Ang opisyal na pangalang Ruso nito ay "associative array," ngunit hindi ito madalas na ginagamit. Ang mas karaniwang mga pagpipilian ay "diksyonaryo", "mapa", o (mas madalas) ang slang anglicism na "mapa" :) Sa loob ng Map, ang data ay naka-imbak sa "key" - "halaga" na format, iyon ay, sa mga pares. Ang parehong mga susi at mga halaga ay maaaring maging anumang mga bagay-mga numero, string, o mga bagay ng iba pang mga klase.

Paano naiiba ang Map sa ibang mga istruktura ng data

Noong nakaraan, tiningnan namin ang mga istruktura ng data kung saan ang mga elemento ay iniimbak nang mag-isa. Sa isang array, o ArrayList / LinkedList , nag-iimbak kami ng isang tiyak na bilang ng mga elemento. Ngunit paano kung magbago ng kaunti ang ating gawain? Halimbawa, isipin na nahaharap tayo sa gawain ng paglikha ng isang listahan ng 100 katao, kung saan itatabi ang buong pangalan at numero ng pasaporte ng tao. Sa prinsipyo, hindi ito mahirap. Halimbawa, maaari mong magkasya pareho sa isang linya at lumikha ng isang listahan ng mga linya tulad nito: "Anna Ivanovna Reshetnikova, 4211 717171." Ngunit ang solusyon na ito ay may dalawang disbentaha. Una, maaaring kailanganin natin ang isang function sa paghahanap ng pasaporte. At sa format na ito para sa pag-iimbak ng impormasyon, ito ay magiging problema. At pangalawa, walang makakapigil sa atin na lumikha ng dalawang magkaibang tao na may parehong numero ng pasaporte. At ito ang pinakaseryosong disbentaha ng aming solusyon. Ang ganitong mga sitwasyon ay dapat na ganap na hindi kasama; walang dalawang tao na may parehong numero ng pasaporte. Narito ang Map at ang mga idineklara nitong feature ay tumulong sa amin (nag-iimbak ng data sa isang pares sa "key"-"value" na format). Tingnan natin ang pinakakaraniwang pagpapatupad ng Map - ang Java HashMap class .HashMap - anong uri ng mapa ito?  - 1

Paglikha ng HashMap sa Java at pakikipagtulungan sa klase

Ang pagpapatupad na ito ay napakasimpleng gawin:
public static void main(String[] args) {

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

}
Dito kami ay lumikha ng isang diksyunaryo kung saan ang mga elemento ay maiimbak sa "number-string" na format. Ang numero ang magiging susi, at ang string ang magiging halaga. Ipinahiwatig din namin kung anong uri ng mga susi ang mayroon kami ( Integer) at kung anong uri ng mga halaga ang mayroon kami ( String). Bakit ganito? Una, ang susi sa isang HashMap ay palaging natatangi . Magiging mahusay ito para sa amin dahil magagamit namin ang numero ng pasaporte bilang susi at maiwasan ang mga duplicate. At ang linya na may buong pangalan ay magsisilbing halaga (ang buong pangalan ng iba't ibang tao ay madaling maulit, walang mali doon para sa amin).

Pagdaragdag ng bagong pares sa isang HashMap

Mukhang ganito ang gawaing ito:
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);

   }

}
Ang pamamaraan ay ginagamit para dito put(). Bukod pa rito, ang HashMap ay may na-override na paraan toString()upang ito ay mai-print sa console. Magiging ganito ang hitsura ng output: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Ivan Mikhailovich Serebryakov}

Mga Tampok ng HashMap Keys

Ngayon tingnan natin kung ang mga susi ay talagang natatangi? Subukan nating magdagdag ng bagong elemento na may susi na sa mapa:
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);

}
Output: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Viktor Mikhailovich Stychkin} Ang nakaraang elemento na may key na 162348, gaya ng nakikita mo, ay na-overwrite. Ang "Susi" ay tinawag na susi para sa isang dahilan. Ang mga halaga sa isang HashMap ay naa-access sa pamamagitan ng susi (ngunit hindi kabaligtaran - ang susi ay hindi maaaring makuha sa pamamagitan ng halaga, dahil ang mga halaga ay maaaring madoble). Ito ay malinaw na nakikita sa mga halimbawa ng pagkuha ng isang elemento, pati na rin ang pag-alis ng isang elemento mula sa isang HashMap:
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);

}
Upang makakuha ng isang halaga o magtanggal ng isang pares mula sa diksyunaryo, dapat naming ipasa nang eksakto ang natatanging key na naaayon sa halagang ito sa mga get()pamamaraan . Walang mga numerical index, tulad ng sa mga array o listahan, sa HashMap - ang halaga ay naa-access sa pamamagitan ng key. Output ng console: Lidiya Arkadyevna Bublikova {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump}remove()

Sinusuri ang pagkakaroon ng isang susi at halaga

Sa mga klase ng ArrayList at LinkedList , maaari naming suriin kung ang isang listahan ay naglalaman ng isang partikular na elemento. Hinahayaan ka rin ng HashMap na gawin ito, at para sa parehong bahagi ng pares: mayroon itong mga pamamaraan containsKey()(nagsusuri para sa pagkakaroon ng isang susi) at containsValue()(nagsusuri para sa pagkakaroon ng isang halaga).
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"));

}
Output: false true

Pagkuha ng listahan ng lahat ng key at value

Ang isa pang maginhawang tampok ng HashMap ay maaari kang makakuha ng hiwalay na listahan ng lahat ng mga susi at lahat ng mga halaga . Para dito, ang mga pamamaraan keySet()at ginagamit 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);

   }

}
Ang mga susi ay kinuha sa koleksyon Set. Ang kakaiba nito ay hindi ito maaaring maglaman ng mga paulit-ulit na elemento. Ngayon ang pangunahing bagay na dapat tandaan ay ang listahan ng lahat ng mga susi ay maaaring alisin sa HashMap sa isang hiwalay na koleksyon. Sa halimbawa, nai-save namin ang mga halaga sa normal ArrayList. Output ng console: Mga Susi: [212133, 8082771, 162348] Mga Halaga: [Lidiya Arkadyevna Bublikova, Donald John Trump, Ivan Mikhailovich Serebryakov] Ang mga pamamaraan size()ay clear()eksaktong pareho sa mga naunang istrukturang pinagdaanan natin: ang una ay nagbabalik ng mga elemento ng numero sa diksyunaryo sa kasalukuyang sandali, tinatanggal ng pangalawa ang lahat ng elemento.
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);

}
Output: 3 {} Upang suriin kung ang aming HashMap ay may kahit isang elemento, maaari naming gamitin ang paraan 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);

   }

}
Output: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Ivan Mikhailovich Serebryakov} Ngayon ay maglalabas kami sa console pagkatapos lamang ng paunang pag-verify :)

Pagsasama-sama ng dalawang mapa sa isa

Ang isa pang kawili-wiling punto ay ang dalawang mapa ay maaaring pagsamahin sa isa . May paraan para dito putAll(). Tinatawag namin ito sa unang HashMap , ipasa ang pangalawa bilang argumento, at ang mga elemento mula sa pangalawa ay idaragdag sa una:
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);

}
Output: {917352=Alexey Andreevich Ermakov, 212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 925648=Maxim Olegovich Arkharov, 162348=Ivan Mikhailovich Serebrya Andikov} Lahat ng elemento ng pasaporte ay copAndsAndiNames2 . Ngayon tingnan natin ang isang mas kumplikadong halimbawa. Lalo na, umulit sa HashMap sa isang loop.
for (Map.Entry entry: passportsAndNames.entrySet()) {

   System.out.println(entry);

}
Ang isang interface Map.Entryay nangangahulugan lamang ng isang key-value pair sa loob ng isang diksyunaryo. Ang pamamaraan entrySet()ay nagbabalik ng isang listahan ng lahat ng mga pares sa aming HashMap (dahil ang aming mapa ay binubuo lamang ng gayong mga pares ng Entry, umuulit kami sa mga pares, at hindi magkahiwalay na mga key o value). Konklusyon: 212133=Lidiya Arkadyevna Bublikova 8082771=Donald John Trump 162348=Ivan Mikhailovich Serebryakov I-save ang artikulong ito para sa hinaharap: https://habr.com/ru/post/128017/ Ngayon ay masyadong maaga para basahin ito, ngunit sa hinaharap , kapag nakuha mo na ang iyong mga kamay sa paggamit ng HashMap, makakatulong ito sa iyong maunawaan kung paano gumagana ang istruktura ng data na ito mula sa loob. Gayundin, huwag kalimutang tingnan ang opisyal na dokumentasyon ng Oracle sa HashMap.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION