CodeGym /Java blog /Tilfældig /HashMap: hvad er det for et kort?
John Squirrels
Niveau
San Francisco

HashMap: hvad er det for et kort?

Udgivet i gruppen
Hej! I denne lektion tager vi en nærmere gennemgang på Java HashMap . Tidligere har vi studeret datastrukturer, hvor elementerne er gemt som sig selv. I et array eller en ArrayList / LinkedList gemmer vi et vist antal elementer. Men hvad nu hvis vores opgave ændrer sig lidt?
HashMap: hvad er det for et kort?  - 1
Forestil dig følgende opgave: Lav en liste med 100 personer, der gemmer hver persons navn og pasnummer. I princippet er det ikke så svært. For eksempel kan du fylde begge i en streng og derefter oprette en liste over disse strenge: "Amelia Aguilar, 4211 717171". Men denne løsning har to ulemper. For det første kan vi have brug for muligheden for at søge efter pasnummer. Og dette vil være problematisk i betragtning af dette informationslagringsformat. For det andet forhindrer intet os i at oprette to forskellige personer med det samme pasnummer. Og dette er vores løsnings mest alvorlige mangel. Dette bør aldrig tillades: to personer har ikke det samme pasnummer. En ny datastruktur kommer os til hjælp: Kort. Det er også kendt som et "associativt array", men dette udtryk bruges sjældent. Mere almindeligt kaldes det en "ordbog" eller "kort". :) Hvordan er det fundamentalt anderledes end de datastrukturer, vi tidligere har overvejet? Frem for alt i det faktum, at data i et kort er gemt som nøgleværdi-par. Alt kan tjene som nøgler og værdier: tal, strenge eller objekter af andre klasser. I dag vil vi studere den mest almindelige implementering af Map- klassen: Java HashMap . HashMap: hvad er det for et kort?  - 2

Så hvad har vi brug for at vide om HashMap i Java?

Det er meget nemt at lave:

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();
}
Her laver vi en ordbog, der gemmer elementer som "tal-streng"-par. Tallet vil fungere som nøglen og strengen som værdien. Vi specificerer også nøgletypen (heltal) og værditypen (streng). Hvorfor? For det første er en HashMap- nøgle altid unik. Dette passer os perfekt, da vi kan bruge pasnummeret som nøgle og undgå dubletter. Værdien vil være en streng med det fulde navn (forskellige personer kan have det samme navn; det er ikke noget for os at bekymre os om). Tilføjelse af et nyt par til HashMap ser sådan ud:

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 bruger metoden put() til dette. Derudover tilsidesætter HashMap toString()- metoden, så den kan vises på konsollen. Outputtet vil se sådan ud: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan den Store} Lad os nu kontrollere, om nøglerne virkelig er unikke? Lad os prøve at tilføje et nyt element med en nøgle, der allerede er blevet brugt på kortet:

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);
}
Output: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Albert Kent} Som du kan se, blev den tidligere værdi forbundet med nøglen 162348 overskrevet. Vi bruger udtrykket "nøgle" af en grund. Værdier i et HashMap tilgås ved hjælp af nøglen, men ikke omvendt. Nøglen kan ikke opnås ved hjælp af en værdi, da værdierne muligvis ikke er unikke. Dette kan tydeligt ses, når du henter eller fjerner et element fra 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);
}
For at få en værdi eller fjerne et par fra ordbogen, skal vi gå til get() og fjerne() den unikke nøgle, der svarer til værdien. I modsætning til arrays og lister har et HashMap i Java ingen numeriske indekser: værdier tilgås ved hjælp af nøglen. Konsoloutput: Bridget Logan {212133=Bridget Logan, 8082771=Donald John Trump} Klasserne ArrayList og LinkedList lader os kontrollere, om listen indeholder et bestemt element. Java HashMap lader os gøre dette. Hvad mere er, vi kan gøre dette for begge medlemmer af parret: Dette er hvad containsKey () (søger efter en nøgle) og containsValue()(tjek for en værdi) metoder er til.

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 anden praktisk funktion ved HashMap i Java er det faktum, at du kan få separate lister over alle nøglerne og alle værdierne. Dette opnås med metoderne keySet() og 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);
   }
}
Nøglerne er trukket ud i et sæt , som vi ikke har dækket endnu. Den er speciel ved, at den ikke kan indeholde gentagne elementer. Nu er det vigtigste at huske, at listen over alle nøgler kan hentes fra et HashMap til en separat samling. I eksemplet gemte vi værdierne i en almindelig ArrayList . Konsoloutput: Taster: [212133, 8082771, 162348] Værdier: [Bridget Logan, Donald John Trump, Ivan den Store] Størrelse () og clear() metoderne gør nøjagtig det samme som i de tidligere strukturer, vi har diskuteret: den første returnerer antallet af elementer i ordbogen i øjeblikket, den anden fjerner alle elementerne.

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);
}
Output: 3 {} For at kontrollere, om der er mindst ét ​​element i vores HashMap , kan vi bruge 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);
   }
}
Output: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan den Store} Nu vil vi kun output til konsollen efter en foreløbig kontrol. :) Et andet interessant punkt er, at to kort kan kombineres til ét. Dette opnås ved hjælp af putAll() metoden. Vi kalder det på det første HashMap , sender det andet som et argument, og elementerne fra det andet føjes til det første:

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);
}
Output: {917352=Clifford Patrick, 212133=Bridget Logan, 8082771=Donald John Trump, 925648=Mitchell Salgado, 162348=Ivan den Store} Alle parrene i pasAndNames2 er blevet kopieret til pasAndNames2 . Overvej nu et mere kompliceret eksempel. Specifikt iteration over et HashMap i en loop.

for (Map.Entry<Integer, String> entry: passportsAndNames.entrySet()) {
   System.out.println(entry);
}
Map.Entry - klassen angiver nøgleværdi-parret inde i ordbogen. EntrySet () -metoden returnerer en liste over alle par i vores HashMap . Fordi vores kort består af disse Map.Entry- par, itererer vi over par, ikke separate nøgler eller værdier. Output: 212133=Bridget Logan 8082771=Donald John Trump 162348=Ivan den Store Glem heller ikke at studere den officielle Oracle- dokumentation for HashMap .
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION