CodeGym /Java blogg /Slumpmässig /HashMap: vilken typ av karta är detta?
John Squirrels
Nivå
San Francisco

HashMap: vilken typ av karta är detta?

Publicerad i gruppen
Hej! I den här lektionen tar vi en närmare recension på Java HashMap . Tidigare har vi studerat datastrukturer där elementen lagras som sig själva. I en array eller en ArrayList / LinkedList lagrar vi ett antal element. Men tänk om vår uppgift förändras lite?
HashMap: vilken typ av karta är detta?  - 1
Föreställ dig följande uppgift: skapa en lista med 100 personer som lagrar varje persons namn och passnummer. I princip är detta inte så svårt. Du kan till exempel stoppa in båda i en sträng och sedan skapa en lista med dessa strängar: " Amelia Aguilar, 4211 717171". Men denna lösning har två nackdelar. Först kan vi behöva möjligheten att söka på passnummer. Och detta kommer att vara problematiskt med tanke på detta informationslagringsformat. För det andra, ingenting hindrar oss från att skapa två olika personer med samma passnummer. Och detta är vår lösnings allvarligaste brist. Detta bör aldrig tillåtas: inga två personer har samma passnummer. En ny datastruktur kommer till vår hjälp: Karta. Det är också känt som en "associativ array", men denna term används sällan. Mer vanligt kallas det en "ordbok" eller "karta". :) Hur är det fundamentalt annorlunda än de datastrukturer som vi har övervägt tidigare? Framför allt i det faktum att data i en karta lagras som nyckel-värdepar. Vad som helst kan fungera som nycklar och värden: siffror, strängar eller objekt i andra klasser. Idag ska vi studera den vanligaste implementeringen av Map- klassen: Java HashMap . HashMap: vilken typ av karta är detta?  - 2

Så vad behöver vi veta om HashMap i Java?

Det är väldigt enkelt att skapa:

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();
}
Här skapar vi en ordbok som lagrar element som "number-string"-par. Numret kommer att fungera som nyckel och strängen som värde. Vi anger också nyckeltypen (heltal) och värdetypen (sträng). Varför? För det första är en HashMap- nyckel alltid unik. Detta passar oss perfekt, eftersom vi kan använda passnumret som nyckel och undvika dubbletter. Värdet kommer att vara en sträng med det fullständiga namnet (olika personer kan ha samma namn, det är inget för oss att oroa oss för). Att lägga till ett nytt par till HashMap ser ut så hä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);
   }
}
Vi använder metoden put() för detta. Dessutom åsidosätter HashMap metoden toString() så att den kan visas på konsolen. Utdata kommer att se ut så här: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan den store} Låt oss nu verifiera om nycklarna verkligen är unika? Låt oss försöka lägga till ett nytt element med en nyckel som redan har använts i kartan:

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);
}
Utdata: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Albert Kent} Som du kan se skrevs det tidigare värdet för nyckeln 162348 över. Vi använder termen "nyckel" av en anledning. Värden i en HashMap nås med nyckeln, men inte tvärtom. Nyckeln kan inte erhållas med ett värde, eftersom värdena kanske inte är unika. Detta kan tydligt ses när du hämtar eller tar bort ett element från HashMap :

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);
}
För att få ett värde eller ta bort ett par från ordboken måste vi skicka till get() och remove() den unika nyckeln som motsvarar värdet. Till skillnad från arrayer och listor har en HashMap i Java inga numeriska index: värden nås med nyckeln. Konsolutgång: Bridget Logan {212133=Bridget Logan, 8082771=Donald John Trump} Klasserna ArrayList och LinkedList låter oss kontrollera om listan innehåller något speciellt element. Java HashMap låter oss göra detta. Dessutom kan vi göra detta för båda medlemmarna i paret: Detta är vad containsKey() (kontrollerar efter en nyckel) och containsValue()(kontrollerar efter ett värde) metoder är fö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.containsKey(11111));
   System.out.println(passportsAndNames.containsValue("Donald John Trump"));
}
Output: false true En annan praktisk funktion med HashMap i Java är det faktum att du kan få separata listor med alla nycklar och alla värden. Detta uppnås med metoderna keySet() och values() :

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);
   }
}
Nycklarna extraheras till ett set , som vi inte har täckt ännu. Den är speciell genom att den inte kan innehålla återkommande element. Nu är det viktigaste att komma ihåg att listan över alla nycklar kan hämtas från en HashMap till en separat samling. I exemplet sparade vi värdena i en vanlig ArrayList . Konsolutgång: Nycklar: [212133, 8082771, 162348] Värden: [Bridget Logan, Donald John Trump, Ivan the Great] Metoderna size() och clear() gör exakt samma sak som i de tidigare strukturerna vi har diskuterat: den första returnerar antalet element för närvarande i ordboken, den andra tar bort alla element.

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);
}
Utdata: 3 {} För att kontrollera om det finns minst ett element i vår HashMap , kan vi använda metoden isEmpty() :

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);
   }
}
Utdata: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan den store} Nu kommer vi bara att skicka ut till konsolen efter en preliminär kontroll. :) En annan intressant punkt är att två kartor kan kombineras till en. Detta åstadkoms med putAll() -metoden. Vi kallar det på den första HashMap , skickar den andra som ett argument, och elementen från den andra läggs till i den första:

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);
}
Utdata: {917352=Clifford Patrick, 212133=Bridget Logan, 8082771=Donald John Trump, 925648=Mitchell Salgado, 162348=Ivan den store} Alla paren i passAndNames2 har kopierats till passportsAndNames . Tänk nu på ett mer komplicerat exempel. Närmare bestämt, iterera över en HashMap i en loop.

for (Map.Entry<Integer, String> entry: passportsAndNames.entrySet()) {
   System.out.println(entry);
}
Map.Entry - klassen anger nyckel-värdeparet i ordboken. Metoden entrySet () returnerar en lista över alla par i vår HashMap . Eftersom vår karta består av dessa Map.Entry- par, itererar vi över par, inte separata nycklar eller värden. Utdata: 212133=Bridget Logan 8082771=Donald John Trump 162348=Ivan den store Glöm inte heller att studera den officiella Oracle- dokumentationen för HashMap .
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION