JavaRush /Java-Blog /Random-DE /HashMap in Java – was für eine Karte ist das?

HashMap in Java – was für eine Karte ist das?

Veröffentlicht in der Gruppe Random-DE
Hallo! Heute werden wir über eine andere Datenstruktur sprechen – Karte. Sein offizieller russischer Name ist „assoziatives Array“, wird aber nicht oft verwendet. Die gebräuchlicheren Optionen sind „Wörterbuch“, „Karte“ oder (am häufigsten) der umgangssprachliche Anglizismus „Karte“ :) In Map werden Daten im Format „Schlüssel“ – „Wert“, also paarweise, gespeichert. Sowohl Schlüssel als auch Werte können beliebige Objekte sein – Zahlen, Zeichenfolgen oder Objekte anderer Klassen.

Wie sich Map von anderen Datenstrukturen unterscheidet

Zuvor haben wir uns Datenstrukturen angesehen, in denen Elemente einzeln gespeichert werden. In einem Array oder ArrayList / LinkedList speichern wir eine bestimmte Anzahl von Elementen. Was aber, wenn sich unsere Aufgabe ein wenig ändert? Stellen Sie sich zum Beispiel vor, dass wir vor der Aufgabe stehen, eine Liste mit 100 Personen zu erstellen, in der der vollständige Name und die Passnummer der Person gespeichert werden. Im Prinzip ist es nicht so schwierig. Sie können beispielsweise beides in eine Zeile einfügen und eine Liste mit Zeilen wie dieser erstellen: „Anna Ivanovna Reshetnikova, 4211 717171.“ Diese Lösung hat jedoch zwei Nachteile. Zunächst benötigen wir möglicherweise eine Passsuchfunktion. Und bei diesem Format zum Speichern von Informationen wird dies problematisch sein. Und zweitens hindert uns nichts daran, zwei verschiedene Personen mit denselben Passnummern zu schaffen. Und das ist der gravierendste Nachteil unserer Lösung. Solche Situationen sollten völlig ausgeschlossen werden, es gibt keine zwei Personen mit derselben Passnummer. Hier kommen uns Map und seine genannten Funktionen zu Hilfe (Speicherung von Daten in einem Paar im „Schlüssel“-„Wert“-Format). Schauen wir uns die gebräuchlichste Map-Implementierung an – die Java-HashMap-Klasse .HashMap – was ist das für eine Karte?  - 1

Erstellen einer HashMap in Java und Arbeiten mit der Klasse

Diese Implementierung ist sehr einfach zu erstellen:
public static void main(String[] args) {

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

}
Hier haben wir ein Wörterbuch erstellt, in dem Elemente im „Zahlen-String“-Format gespeichert werden. Die Zahl ist der Schlüssel und die Zeichenfolge ist der Wert. Wir haben auch angegeben, welche Art von Schlüsseln wir haben werden ( Integer) und welche Art von Werten ( String). Warum ist das so? Erstens ist der Schlüssel in einer HashMap immer eindeutig . Das wird für uns großartig funktionieren, weil wir die Passnummer als Schlüssel verwenden und Duplikate vermeiden können. Und die Zeile mit dem vollständigen Namen dient als Wert (der vollständige Name verschiedener Personen kann leicht wiederholt werden, daran ist für uns nichts auszusetzen).

Hinzufügen eines neuen Paares zu einer HashMap

Diese Aufgabe sieht so aus:
public class Main {

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


       passportsAndNames.put(212133, „Lydia Arkadievna Bublikova“);
       passportsAndNames.put(162348, „Iwan Michailowitsch Serebjakow“);
       passportsAndNames.put(8082771, „Donald John Trump“);
       System.out.println(passportsAndNames);

   }

}
Hierzu wird die Methode verwendet put(). Darüber hinaus verfügt HashMap über eine überschriebene Methode, toString()sodass sie auf der Konsole ausgegeben werden kann. Die Ausgabe sieht folgendermaßen aus: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Ivan Mikhailovich Serebryakov}

Funktionen von HashMap-Schlüsseln

Lassen Sie uns nun prüfen, ob die Schlüssel wirklich einzigartig sind. Versuchen wir, ein neues Element mit einem bereits in der Karte vorhandenen Schlüssel hinzuzufügen :
public static void main(String[] args) {

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

   passportsAndNames.put(212133, „Lydia Arkadievna Bublikova“);
   passportsAndNames.put(162348, „Iwan Michailowitsch Serebjakow“);
   passportsAndNames.put(8082771, „Donald John Trump“);
   passportsAndNames.put(162348, „Wiktor Michailowitsch Stytschkin“);//Wiederholungstaste

   System.out.println(passportsAndNames);

}
Ausgabe: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Viktor Mikhailovich Stychkin} Das vorherige Element mit dem Schlüssel 162348 wurde, wie Sie sehen können, überschrieben. „Der Schlüssel“ wurde nicht umsonst als Schlüssel bezeichnet. Auf Werte in einer HashMap wird über den Schlüssel zugegriffen (aber nicht umgekehrt – der Schlüssel kann nicht über den Wert abgerufen werden, da Werte dupliziert werden können). Dies wird deutlich an den Beispielen zum Abrufen eines Elements sowie zum Entfernen eines Elements aus einer HashMap deutlich:
public static void main(String[] args) {

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

   passportsAndNames.put(212133, „Lydia Arkadievna Bublikova“);
   passportsAndNames.put(162348, „Iwan Michailowitsch Serebjakow“);
   passportsAndNames.put(8082771, „Donald John Trump“);

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


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

}
Um einen Wert zu erhalten oder ein Paar aus dem Wörterbuch zu entfernen, müssen wir genau den eindeutigen Schlüssel, der diesem Wert entspricht, an die get()Methoden übergeben. In HashMap gibt es keine numerischen Indizes wie in Arrays oder Listen – der Zugriff auf den Wert erfolgt über einen Schlüssel. Konsolenausgabe: Lidiya Arkadyevna Bublikova {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump}remove()

Prüfung auf Vorhandensein eines Schlüssels und Werts

In den Klassen ArrayList und LinkedList könnten wir prüfen, ob eine Liste ein bestimmtes Element enthält. Mit HashMap können Sie dies auch tun, und zwar für beide Teile des Paares: Es verfügt über Methoden containsKey()(überprüft das Vorhandensein eines Schlüssels) und containsValue()(überprüft das Vorhandensein eines Werts).
public static void main(String[] args) {

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

   passportsAndNames.put(212133, „Lydia Arkadievna Bublikova“);
   passportsAndNames.put(162348, „Iwan Michailowitsch Serebjakow“);
   passportsAndNames.put(8082771, „Donald John Trump“);


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

}
Ausgabe: falsch wahr

Eine Liste aller Schlüssel und Werte abrufen

Eine weitere praktische Funktion von HashMap besteht darin, dass Sie eine separate Liste aller Schlüssel und aller Werte erhalten können . Hierzu werden Methoden keySet()und verwendet 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, „Iwan Michailowitsch Serebjakow“);
       passportsAndNames.put(8082771, „Donald John Trump“);

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

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

   }

}
Die Schlüssel werden in die Sammlung extrahiert Set. Seine Besonderheit besteht darin, dass es keine sich wiederholenden Elemente enthalten kann. Jetzt ist es vor allem zu beachten, dass die Liste aller Schlüssel aus der HashMap in eine separate Sammlung übernommen werden kann. Im Beispiel haben wir die Werte auf normal gespeichert ArrayList. Konsolenausgabe: Schlüssel: [212133, 8082771, 162348] Werte: [Lidiya Arkadyevna Bublikova, Donald John Trump, Ivan Mikhailovich Serebryakov] Methoden size()machen clear()genau das Gleiche wie in den vorherigen Strukturen, die wir durchgegangen sind: Die erste gibt ein Zahlenelement zurück im Wörterbuch zum aktuellen Zeitpunkt, der zweite löscht alle Elemente.
public static void main(String[] args) {

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

   passportsAndNames.put(212133, „Lydia Arkadievna Bublikova“);
   passportsAndNames.put(162348, „Iwan Michailowitsch Serebjakow“);
   passportsAndNames.put(8082771, „Donald John Trump“);

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

}
Ausgabe: 3 {} Um zu überprüfen, ob unsere HashMap mindestens ein Element hat, können wir die Methode verwenden isEmpty():
public static void main(String[] args) {

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

   passportsAndNames.put(212133, „Lydia Arkadievna Bublikova“);
   passportsAndNames.put(162348, „Iwan Michailowitsch Serebjakow“);
   passportsAndNames.put(8082771, „Donald John Trump“);

   if (!passportsAndNames.isEmpty()) {

       System.out.println(passportsAndNames);

   }

}
Ausgabe: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Ivan Mikhailovich Serebryakov} Jetzt werden wir erst nach vorläufiger Überprüfung auf die Konsole ausgeben :)

Zwei Karten zu einer kombinieren

Ein weiterer interessanter Punkt ist, dass zwei Karten zu einer kombiniert werden können . Dafür gibt es eine Methode putAll(). Wir rufen es auf der ersten HashMap auf, übergeben die zweite als Argument und die Elemente aus der zweiten werden zur ersten hinzugefügt:
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, „Iwan Michailowitsch Serebjakow“);
   passportsAndNames.put(8082771, „Donald John Trump“);

   passportsAndNames2.put(917352, „Alexej Andrejewitsch Ermakow“);
   passportsAndNames2.put(925648, „Maxim Olegovich Arkharov“);


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

}
Ausgabe: {917352=Alexey Andreevich Ermakov, 212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 925648=Maxim Olegovich Arkharov, 162348=Ivan Mikhailovich Serebryakov} Alle Elemente von PassportsAndNames2 wurden nach PassportsAndNames kopiert . Schauen wir uns nun ein komplizierteres Beispiel an. Iterieren Sie nämlich HashMap in einer Schleife.
for (Map.Entry entry: passportsAndNames.entrySet()) {

   System.out.println(entry);

}
Eine Schnittstelle Map.Entrybedeutet lediglich ein Schlüssel-Wert-Paar innerhalb eines Wörterbuchs. Die Methode entrySet()gibt eine Liste aller Paare in unserer HashMap zurück (da unsere Karte nur aus solchen Eintragspaaren besteht, iterieren wir über Paare und nicht über einzelne Schlüssel oder Werte). Fazit: 212133=Lidiya Arkadyevna Bublikova 8082771=Donald John Trump 162348=Ivan Mikhailovich Serebryakov Speichern Sie diesen Artikel für die Zukunft: https://habr.com/ru/post/128017/ Jetzt ist es zu früh, ihn zu lesen, aber in der Zukunft , wenn Sie HashMap in die Hand nehmen, wird es Ihnen helfen, zu verstehen, wie diese Datenstruktur von innen heraus funktioniert. Vergessen Sie auch nicht, sich die offizielle Oracle- Dokumentation zu HashMap anzusehen .
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION