JavaRush /Java Blog /Random-IT /HashMap in Java: che tipo di mappa è?

HashMap in Java: che tipo di mappa è?

Pubblicato nel gruppo Random-IT
Ciao! Oggi parleremo di un'altra struttura dati: la mappa. Il suo nome ufficiale russo è “array associativo”, ma non viene utilizzato spesso. Le opzioni più comuni sono "dizionario", "mappa" o (molto spesso) l'anglicismo gergale "mappa" :) All'interno di Mappa, i dati vengono archiviati nel formato "chiave" - ​​"valore", ovvero in coppia. Sia le chiavi che i valori possono essere qualsiasi oggetto: numeri, stringhe o oggetti di altre classi.

In che modo Map differisce dalle altre strutture dati

In precedenza, abbiamo esaminato le strutture dati in cui gli elementi sono archiviati da soli. In un array, o ArrayList / LinkedList , memorizziamo un certo numero di elementi. Ma cosa succede se il nostro compito cambia leggermente? Ad esempio, immagina di trovarci di fronte al compito di creare un elenco di 100 persone, in cui verranno archiviati il ​​nome completo e il numero di passaporto della persona. In linea di principio, non è così difficile. Ad esempio, puoi inserirli entrambi in una riga e creare un elenco di righe come questo: "Anna Ivanovna Reshetnikova, 4211 717171". Ma questa soluzione presenta due inconvenienti. Innanzitutto, potremmo aver bisogno di una funzione di ricerca del passaporto. E con questo formato per l'archiviazione delle informazioni, ciò sarà problematico. E in secondo luogo, nulla ci impedirà di creare due persone diverse con gli stessi numeri di passaporto. E questo è lo svantaggio più grave della nostra soluzione. Tali situazioni dovrebbero essere completamente escluse; non esistono due persone con lo stesso numero di passaporto. Qui la Mappa e le sue caratteristiche dichiarate ci vengono in aiuto (memorizzazione dei dati in coppia nel formato “chiave”-”valore”). Diamo un'occhiata all'implementazione della mappa più comune: la classe Java HashMap .HashMap: che tipo di mappa è questa?  -1

Creare una HashMap in Java e lavorare con la classe

Questa implementazione è molto semplice da creare:
public static void main(String[] args) {

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

}
Qui abbiamo creato un dizionario in cui gli elementi verranno memorizzati nel formato “stringa numerica”. Il numero sarà la chiave e la stringa sarà il valore. Abbiamo anche indicato che tipo di chiavi avremo ( Integer) e che tipo di valori ( String). Perché è così? Innanzitutto, la chiave in una HashMap è sempre unica . Questo funzionerà benissimo per noi perché possiamo usare il numero del passaporto come chiave ed evitare duplicati. E la riga con il nome completo fungerà da valore (il nome completo di persone diverse può essere facilmente ripetuto, per noi non c'è niente di sbagliato).

Aggiunta di una nuova coppia a una HashMap

Questa attività è simile alla seguente:
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);

   }

}
A questo scopo viene utilizzato il metodo put(). Inoltre, HashMap ha un metodo sovrascritto toString()in modo che possa essere stampato sulla console. L'output sarà simile al seguente: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Ivan Mikhailovich Serebryakov}

Caratteristiche delle chiavi HashMap

Ora controlliamo se le chiavi sono davvero uniche? Proviamo ad aggiungere un nuovo elemento con una chiave già esistente nella mappa:
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);

}
Risultato: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Viktor Mikhailovich Stychkin} L'elemento precedente con la chiave 162348, come puoi vedere, è stato sovrascritto. “La Chiave” era chiamata la chiave per un motivo. L'accesso ai valori in una HashMap avviene tramite chiave (ma non viceversa: la chiave non può essere ottenuta tramite valore, poiché i valori possono essere duplicati). Ciò è chiaramente visibile negli esempi di acquisizione di un elemento e di rimozione di un elemento da una 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);

}
Per ottenere un valore o rimuovere una coppia dal dizionario, dobbiamo passare esattamente la chiave univoca corrispondente a questo valore ai get()metodi . Non ci sono indici numerici, come negli array o negli elenchi, in HashMap : si accede al valore tramite chiave. Uscita console: Lidiya Arkadyevna Bublikova {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump}remove()

Verifica della presenza di una chiave e di un valore

Nelle classi ArrayList e LinkedList , potremmo verificare se una lista contiene un particolare elemento. Anche HashMap ti consente di farlo, e per entrambe le parti della coppia: ha metodi containsKey()(controlla la presenza di una chiave) e containsValue()(controlla la presenza di un valore).
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"));

}
Risultato: falso vero

Ottenere un elenco di tutte le chiavi e i valori

Un'altra caratteristica utile di HashMap è che puoi ottenere separatamente un elenco di tutte le chiavi e tutti i valori . Per questo, vengono utilizzati metodi keySet()e 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);

   }

}
Le chiavi vengono estratte nella collezione Set. La sua particolarità è che non può contenere elementi ripetitivi. Ora la cosa principale da ricordare è che l'elenco di tutte le chiavi può essere estratto da HashMap in una raccolta separata. Nell'esempio, abbiamo salvato i valori su normal ArrayList. Output della console: Chiavi: [212133, 8082771, 162348] Valori: [Lidiya Arkadyevna Bublikova, Donald John Trump, Ivan Mikhailovich Serebryakov] I metodi size()fanno clear()esattamente la stessa cosa delle strutture precedenti che abbiamo esaminato: il primo restituisce un numero di elementi nel dizionario in questo momento, il secondo cancella tutti gli elementi.
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 {} Per verificare se la nostra HashMap ha almeno un elemento, possiamo utilizzare il metodo 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} Ora eseguiremo l'output sulla console solo dopo la verifica preliminare :)

Combinando due mappe in una

Un altro punto interessante è che due mappe possono essere combinate in una sola . C'è un metodo per questo putAll(). Lo chiamiamo sulla prima HashMap , passiamo la seconda come argomento e gli elementi della seconda verranno aggiunti al primo:
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 Serebryakov} Tutti gli elementi di PassportsAndNames2 sono stati copiati in PassportsAndNames . Ora diamo un'occhiata a un esempio più complicato. Vale a dire, scorrere HashMap in un ciclo.
for (Map.Entry entry: passportsAndNames.entrySet()) {

   System.out.println(entry);

}
Un'interfaccia Map.Entrysignifica semplicemente una coppia chiave-valore all'interno di un dizionario. Il metodo entrySet()restituisce un elenco di tutte le coppie nella nostra HashMap (poiché la nostra mappa è costituita proprio da tali coppie di voci, iteriamo sulle coppie e non su chiavi o valori separatamente). Conclusione: 212133=Lidiya Arkadyevna Bublikova 8082771=Donald John Trump 162348=Ivan Mikhailovich Serebryakov Salva questo articolo per il futuro: https://habr.com/ru/post/128017/ Ora è troppo presto per leggerlo, ma in futuro , quando metterai le mani su HashMap, ti aiuterà a capire come funziona questa struttura di dati dall'interno. Inoltre, non dimenticare di consultare la documentazione ufficiale Oracle su HashMap.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION