what is hashmap java
Questo tutorial Java HashMap spiega cos'è una HashMap in Java e come usarla. Include come dichiarare, inizializzare, iterare, implementare e stampare HashMap:
HashMap in Java è una raccolta basata su Map e consiste di coppie chiave-valore. Una HashMap è indicata da o. È possibile accedere a un elemento HashMap utilizzando una chiave, ovvero dobbiamo conoscere la chiave per accedere all'elemento HashMap.
Una HashMap utilizza una tecnica chiamata 'Hashing'. Nell'hashing, una stringa più lunga viene convertita in una stringa più corta applicando un algoritmo o una 'funzione hash'. Una stringa viene convertita in una stringa più breve in quanto aiuta nella ricerca che è più veloce. Viene anche utilizzato per un'indicizzazione efficiente.
=> Visita qui per l'esclusiva serie di tutorial di formazione Java.
Cosa imparerai:
- HashMap in Java
- Java Map Vs HashMap
- Conclusione
HashMap in Java
Una HashMap è simile a HashTable con la differenza che la HashMap non è sincronizzata e consente valori null per chiave e valore.
Di seguito sono riportate alcune delle caratteristiche importanti di HashMap:
- HashMap è implementato in Java nella classe 'Hashmap' che fa parte del pacchetto java.util.
- La classe HashMap eredita dalla classe “AbstractMap” che implementa parzialmente l'interfaccia Map.
- HashMap implementa anche interfacce 'clonabili' e 'serializzabili'.
- HashMap consente valori duplicati ma non consente chiavi duplicate. HashMap consente anche più valori null ma una chiave null può essere solo uno.
- HashMap non è sincronizzato e inoltre non garantisce l'ordine degli elementi.
- La classe Java HashMap ha una capacità iniziale di 16 e il fattore di carico predefinito (iniziale) è 0,75.
Come dichiarare una HashMap in Java?
Una HashMap in Java fa parte del pacchetto java.util. Quindi, se abbiamo bisogno di usare HashMap nel nostro codice, dobbiamo prima importare la classe di implementazione usando una delle seguenti istruzioni:
import java.util.*;
O
import java.util.HashMap;
La dichiarazione generale della classe HashMap è:
public class HashMap extends AbstractMap implements Map, Cloneable, Serializable
Qui, K => tipo di chiavi presenti nella mappa
V => tipo di valori mappati alle chiavi nella mappa
Crea una mappa hash
Una HashMap in Java può essere creata come segue:
import java.util.HashMap; HashMap cities_map = new HashMap ();
La dichiarazione precedente include prima la classe HashMap in Java. Quindi, nella dichiarazione successiva, creiamo una HashMap denominata 'cities_map' con il tipo di chiave come Integer e Values come String.
Una volta creata la HashMap, dobbiamo inizializzarla con i valori.
Come inizializzare la mappa hash?
Possiamo inizializzare la HashMap usando il metodo put inserendo alcuni valori nella mappa.
Il programma seguente mostra l'inizializzazione di HashMap in Java.
import java.util.*; class Main{ public static void main(String args[]){ //create a HashMap and print HashMap colorsMap=new HashMap(); System.out.println('Initial Map: '+colorsMap); //put some initial values into it using put method colorsMap.put(100,'Red'); colorsMap.put(101,'Green'); colorsMap.put(102,'Blue'); //print the HashMap System.out.println('After adding elements:'); for(Map.Entry m:colorsMap.entrySet()){ System.out.println(m.getKey()+' '+m.getValue()); } } }
Produzione:
Mappa iniziale: {}
Dopo aver aggiunto gli elementi:
100 Rete
101 Verde
102 Blu
Come funziona internamente una HashMap?
Sappiamo che HashMap è una raccolta di coppie chiave-valore e utilizza una tecnica chiamata 'Hashing'. Internamente, HashMap è un array di nodi. HashMap utilizza array e LinkedList per memorizzare le coppie chiave-valore.
Di seguito è riportata una struttura di un nodo di HashMap che è rappresentato programmaticamente come una classe.
Come si vede dalla rappresentazione del nodo sopra, un nodo ha una struttura simile a un nodo di elenco collegato. Un array di questi nodi è chiamato Bucket. Ogni bucket può non avere la stessa capacità e può avere anche più di un nodo.
Le prestazioni di HashMap sono influenzate da due parametri:
(i) Capacità iniziale: La capacità è definita come il numero di bucket in HashMap. La capacità iniziale è definita come la capacità dell'oggetto HashMap quando viene creato. La capacità di HashMap viene sempre moltiplicata per 2.
(ii) Fattore di carico: LoadFactor è il parametro che misura quando verrà eseguito il rehashing, aumentando la capacità.
Si noti che se la capacità è elevata, il fattore di carico sarà piccolo poiché non sarà richiesto alcun rehashing. Allo stesso modo, quando la capacità è bassa, il fattore di carico sarà alto poiché dovremo ripetere frequentemente. Quindi dovremmo fare attenzione a scegliere attentamente questi due fattori per progettare una hashMap efficiente.
Come iterare una HashMap?
HashMap deve essere attraversato per manipolare o stampare le coppie chiave-valore.
Ci sono due modi in cui possiamo attraversare o iterare attraverso HashMap.
- Utilizzo del ciclo for
- Utilizzando il ciclo while e l'iteratore.
Il programma Java di seguito mostra l'implementazione di entrambi questi metodi.
Per prima cosa, recuperiamo il set di voci da HashMap utilizzando il metodo entrySet e quindi attraversiamo il set utilizzando il ciclo for. Quindi stampiamo le coppie chiave-valore utilizzando rispettivamente i metodi getKey () e getValue ().
Per attraversare la HashMap utilizzando un ciclo while, impostiamo prima un iteratore per HashMap e quindi accediamo alle coppie chiave-valore utilizzando l'iteratore.
import java.util.*; public class Main{ public static void main(String [] args) { //create a HashMap and initialize it HashMap cities_map = new HashMap(); cities_map.put(10, 'MUM'); cities_map.put(1, 'DL'); cities_map.put(20, 'PUN'); cities_map.put(7, 'GOA'); cities_map.put(3, 'HYD'); //print using for loop System.out.println('HashMap using for Loop:'); System.out.println(' KEY VALUE'); for (Map.Entry mapSet : cities_map.entrySet()) { System.out.println(' '+mapSet.getKey() + ' ' + mapSet.getValue()); } //print using while loop with iterator System.out.println('HashMap using while Loop:'); System.out.println(' KEY VALUE'); Iterator iterator = cities_map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry mapSet2 = (Map.Entry) iterator.next(); System.out.println(' '+mapSet2.getKey() + ' ' + mapSet2.getValue()); } } }
Produzione:
HashMap utilizzando per Loop:
VALORE CHIAVE
1 DL
3 LUNGO
20 PUN
7 GOA
10 MAMMA
HashMap utilizzando while Loop:
VALORE CHIAVE
1 DL
3 LUNGO
20 PUN
7 GOA
10 MAMMA
Stampa una mappa hash
Vediamo un altro esempio di stampa di hashMap utilizzando il ciclo foreach mostrato nel programma seguente.
import java.util.HashMap; public class Main { public static void main(String[] args) { // create a HashMap and initialize HashMap colors = new HashMap(); colors.put('Red', 1); colors.put('Orange', 5); colors.put('Magenta', 8); //print the HashMap System.out.println('HashMap contents:'); System.out.println(' KEY VALUE'); for (String i : colors.keySet()) { System.out.println(' ' + i + ' ' + colors.get(i)); } } }
Produzione:
Contenuti HashMap:
VALORE CHIAVE
Rete 1
Magenta 8
Arancio 5
Costruttore / metodi HashMap in Java
Le tabelle seguenti mostrano i costruttori e i metodi forniti dalla classe HashMap in Java.
core java intervista domande e risposte per esperti
Costruttori
Prototipo del costruttore | Descrizione | |
---|---|---|
metti tutto | void putAll (Mappa mappa) | Inserisce gli elementi 'map' specificati nella HashMap. |
HashMap () | Costruttore predefinito. | |
HashMap (Mappa m) | Crea una nuova HashMap dall'oggetto mappa dato m. | |
HashMap (capacità interna) | Crea una nuova HashMap con la capacità iniziale data dall'argomento 'capacità'. | |
HashMap (int capacità, float loadFactor) | Crea una nuova HashMap utilizzando i valori di capacità e loadFactor forniti dal costruttore. |
Metodi
Metodo | Metodo Prototipo | Descrizione |
---|---|---|
chiaro | void clear () | Cancella tutte le mappature in HashMap |
è vuoto | booleano isEmpty () | Controlla se HashMap è vuoto. Restituisce vero se sì. |
clone | Oggetto clone () | Restituisce una copia superficiale senza clonare le mappature di chiavi e valori in HashMap. |
entrySet | Imposta entrySet () | Restituisce i mapping in HashMap come una raccolta |
mazzo di chiavi | Imposta keySet () | Restituisce un set di chiavi nella HashMap. |
mettere | V put (chiave oggetto, valore oggetto) | Inserisce una voce di valore-chiave in HashMap. |
putIfAbsent | V putIfAbsent (tasto K, valore V) | Inserisce una data coppia chiave-valore in HashMap se non è già presente. |
rimuovere | V remove (Object key) | Elimina una voce da HashMap per la chiave specificata. |
rimuovere | booleano remove (chiave oggetto, valore oggetto) | Elimina la coppia chiave-valore specificata da HashMap. |
calcolare | Calcolo V (tasto K, funzione di rimappatura BiFunction) | Calcola la mappatura utilizzando la 'funzione di rimappatura' per la chiave specificata e il suo valore corrente o valore nullo. |
Metodo | Metodo Prototipo | Descrizione |
computeIfAbsent | V computeIfAbsent (tasto K, Function mappingFunction) | Calcola la mappatura utilizzando 'mappingFunction' e inserisce coppie chiave-valore se non è già presente o è nulla. |
computeIfPresent | V computeIfPresent (tasto K, BiFunction remappingFunction) | Calcola una nuova mappatura utilizzando 'remappingFunction' data la chiave se la chiave è già presente e non è nulla. |
contieneValore | boolean containsValue (valore oggetto) | Controlla se il valore specificato esiste in HashMap e restituisce true in caso affermativo. |
contieneKey | booleano containsKey (chiave oggetto) | Controlla se la chiave data è presente in HashMap e restituisce true se sì. |
è uguale a | booleano è uguale a (Oggetto o) | Confronta un dato oggetto con HashMap. |
per ciascuno | void forEach (azione BiConsumer) | Esegue l ''azione' data per ciascuna delle voci in HashMap. |
ottenere | V get (Object key) | Restituisce l'oggetto contenente la chiave data con il valore associato. |
getOrDefault | V getOrDefault (Object key, V defaultValue) | Restituisce il valore a cui è mappata la chiave specificata. Se non mappato, restituisce il valore predefinito. |
è vuoto | booleano isEmpty () | Controlla se HashMap è vuoto. |
partire | Unione V (tasto K, valore V, funzione di rimappatura BiFunction) | Verifica se la chiave fornita è null o non è associata a value, quindi la associa a un valore non null utilizzando remappingFunction. |
sostituire | V sostituire (tasto K, valore V) | Sostituisce il valore fornito per la chiave specificata. |
sostituire | sostituzione booleana (K key, V oldValue, V newValue) | Sostituisce il vecchio valore della chiave data con il nuovo valore |
sostituisci tutto | void replaceAll (funzione BiFunction) | Esegue la funzione data e sostituisce tutti i valori in HashMap con il risultato della funzione. |
valori | Valori di raccolta () | Restituisce la raccolta di valori presenti in HashMap. |
taglia | int size () | Restituisce la dimensione del numero di voci in HashMap. |
Implementazione Hashmap
Successivamente, implementeremo la maggior parte di queste funzioni in un programma Java per comprenderne meglio il funzionamento.
Il seguente programma Java mostra un'implementazione di HashMap in Java. Nota che abbiamo utilizzato la maggior parte dei metodi discussi sopra.
import java.util.*; public class Main { public static void main(String args[]) { HashMap hash_map = new HashMap(); hash_map.put(12, 'Leo'); hash_map.put(2, 'Seville'); hash_map.put(7, 'Lacy'); hash_map.put(49, 'Lily'); hash_map.put(3, 'Dillon'); System.out.println('HashMap contents:'); System.out.println(' KEY VALUE'); //display HashMap contents Set setIter = hash_map.entrySet(); Iterator map_iterator = setIter.iterator(); while(map_iterator.hasNext()) { Map.Entry map_entry = (Map.Entry)map_iterator.next(); System.out.println(' '+ map_entry.getKey() + ' ' + map_entry.getValue()); } //get value for the given key String var= hash_map.get(2); System.out.println('Value at index 2 is: '+var); //delete value given the key hash_map.remove(3); System.out.println('Hashmap after removal:'); System.out.println(' KEY VALUE'); Set iter_set = hash_map.entrySet(); Iterator iterator = iter_set.iterator(); while(iterator.hasNext()) { Map.Entry mentry = (Map.Entry)iterator.next(); System.out.println(' '+mentry.getKey() + ' ' + mentry.getValue() ); } } }
Produzione:
Contenuti HashMap:
VALORE CHIAVE
49 Lily
2 Siviglia
3 Dillon
7 Lacy
12 Leone
Il valore all'indice 2 è: Siviglia
Hashmap dopo la rimozione:
VALORE CHIAVE
49 Lily
2 Siviglia
7 Lacy
12 Leone
Ordina HashMap in Java
In Java, HashMap non conserva l'ordine. Quindi abbiamo bisogno di ordinare gli elementi in HashMap. Possiamo ordinare gli elementi nella HashMap in base a chiavi o valori. In questa sezione, discuteremo entrambi gli approcci di ordinamento.
Ordina HashMap per chiavi
import java.util.*; public class Main { public static void main(String[] args) { //create and initialize a HashMap HashMap colors_map = new HashMap(); colors_map.put(9, 'Magenta'); colors_map.put(11, 'Yellow'); colors_map.put(7, 'Cyan'); colors_map.put(23, 'Brown'); colors_map.put(5, 'Blue'); colors_map.put(3, 'Green'); colors_map.put(1, 'Red'); //print the unsorted HashMap by getting a set and using iterator System.out.println('Unsorted HashMap:'); Set set = colors_map.entrySet(); Iterator iterator = set.iterator(); while(iterator.hasNext()) { Map.Entry me = (Map.Entry)iterator.next(); System.out.print(me.getKey() + ': '); System.out.println(me.getValue()); } //create a treemap from given HashMap so that the keys are sorted Map map = new TreeMap(colors_map); System.out.println('HashMap Sorted on keys:'); //print the sorted HashMap Set set2 = map.entrySet(); Iterator iterator2 = set2.iterator(); while(iterator2.hasNext()) { Map.Entry me2 = (Map.Entry)iterator2.next(); System.out.print(me2.getKey() + ': '); System.out.println(me2.getValue()); } } }
Produzione:
HashMap non ordinata:
1: rete
3: verde
5: blu
7: ciano
23: marrone
9: magenta
11: giallo
HashMap ordinato sui tasti:
1: rete
3: verde
5: blu
7: ciano
9: magenta
11: giallo
23: marrone
Nel programma sopra, vediamo che una volta che la hashmap è definita e popolata con i valori, creiamo una treemap da questa hashmap. Quando la hashmap viene convertita in una mappa ad albero, le sue chiavi vengono ordinate automaticamente. Pertanto, quando visualizziamo questa mappa ad albero, otteniamo la mappa ordinata sui tasti.
Ordina HashMap per valori
Per ordinare una HashMap in base ai valori, prima convertiamo la hashmap in una LinkedList. Quindi usiamo il metodo Collections.sort insieme al comparatore per ordinare l'elenco. Questo elenco viene quindi riconvertito in HashMap. La HashMap ordinata viene quindi stampata.
import java.util.*; public class Main { public static void main(String[] args) { //Create and initialize the HashMap HashMap colors_map = new HashMap(); colors_map.put(5, 'B'); colors_map.put(11, 'O'); colors_map.put(3, 'I'); colors_map.put(13, 'R'); colors_map.put(7, 'G'); colors_map.put(1, 'V'); colors_map.put(9, 'Y'); //print the HashMap using iterator after converting to set System.out.println('Unsorted HashMap:'); Set set = colors_map.entrySet(); Iterator iterator = set.iterator(); while(iterator.hasNext()) { Map.Entry map_entry = (Map.Entry)iterator.next(); System.out.print(map_entry.getKey() + ': '); System.out.println(map_entry.getValue()); } //call sortByValues method that returns a sorted Map. Map c_map = sortByValues(colors_map); System.out.println('HashMap sorted on values:'); //print the sorted HashMap Set set2 = c_map.entrySet(); Iterator iterator2 = set2.iterator(); while(iterator2.hasNext()) { Map.Entry map_entry2 = (Map.Entry)iterator2.next(); System.out.print(map_entry2.getKey() + ': '); System.out.println(map_entry2.getValue()); } } private static HashMap sortByValues(HashMap hash_map) { //create a LinkedList from HashMap List list = new LinkedList(hash_map.entrySet()); // use Collections.sort method with Comparator to sort the list Collections.sort(list, new Comparator() { public int compare(Object o1, Object o2) { return ((Comparable) ((Map.Entry) (o1)).getValue()) .compareTo(((Map.Entry) (o2)).getValue()); } }); //create a HashMap from linkedlist which preserves the order HashMap sortedHashMap = new LinkedHashMap(); for (Iterator it = list.iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry) it.next(); sortedHashMap.put(entry.getKey(), entry.getValue()); } return sortedHashMap; } }
Produzione:
HashMap non ordinata:
1: V
3: I
5: B
7: G
9: e
11: O
13: R
HashMap ordinato in base ai valori:
5: B
7: G
3: I
11: O
13: R
1: V
9: e
HashMap simultaneo in Java
Nella normale HashMap, non saremo in grado di modificare gli elementi in fase di runtime o durante l'esecuzione dell'iterazione.
L'implementazione di una mappa simultanea è mostrata di seguito:
import java.util.*; import java.util.concurrent.ConcurrentHashMap; public class Main { public static void main(String[] args) { //declare and initialize ConcurrentHashMap Map cCMap = new ConcurrentHashMap(); cCMap.put('1', '10'); cCMap.put('2', '10'); cCMap.put('3', '10'); cCMap.put('4', '10'); cCMap.put('5', '10'); cCMap.put('6', '10'); //print the initial ConcurrentHashMap System.out.println('Initial ConcurrentHashMap: '+cCMap); //define the iterator over the keys of ConcurrentHashMap Iterator it = cCMap.keySet().iterator(); //change one of the keys using iterator while(it.hasNext()){ String key = it.next(); if(key.equals('3')) cCMap.put(key+'c_map', 'c_map'); } //print the changed ConcurrentHashMap System.out.println('
ConcurrentHashMap after iterator: '+cCMap); } }
Produzione:
Mappa hash simultanea iniziale: {1 = 10, 2 = 10, 3 = 10, 4 = 10, 5 = 10, 6 = 10}
ConcurrentHashMap dopo l'iteratore: {1 = 10, 2 = 10, 3 = 10, 4 = 10, 5 = 10, 6 = 10, 3c_map = c_map}
Si noti che se avessimo eseguito la stessa operazione con HashMap, avrebbe generato ConcurrentModificationException.
Java Map Vs HashMap
Tabularizziamo alcune delle differenze tra Map e HashMap in Java.
Carta geografica | HashMap |
---|---|
È un'interfaccia astratta. | È un'implementazione dell'interfaccia Map. |
L'interfaccia deve essere implementata da altre classi affinché la sua funzionalità sia disponibile. | È una classe concreta e oggetti di classe possono essere creati per ottenere la funzionalità. |
L'implementazione dell'interfaccia della mappa come TreeMap non consente valori nulli. | Consente valori e chiavi nulli. |
TreeMap non consente valori duplicati. | Può avere valori duplicati. |
Viene mantenuto un ordinamento naturale degli oggetti. | Nessun ordine di input viene mantenuto in HashMap. |
Domande frequenti
D # 1) Perché HashMap viene utilizzato in Java?
Risposta: Essendo HashMap la raccolta di coppie chiave-valore, aiuta la ricerca dei dati in base alla sola chiave. Inoltre, poiché utilizza tecniche di hashing, fornisce una ricerca efficiente dei dati.
Q # 2)Come si crea una mappa hash?
Risposta: È possibile creare una HashMap istanziando la classe 'HashMap' del pacchetto java.util. Una hashMap con chiavi di tipo intero e valori di tipo stringa può essere creata come segue:
HashMap myMap= new HashMap();
Q # 3)HashMap è ordinato in Java?
Risposta: No, HashMap non è ordinato in Java. Non viene utilizzato in Java a tale scopo, ma viene utilizzato per memorizzare elementi in coppie chiave-valore.
Q # 4)HashMap è thread-safe?
Risposta: NO, hashMap non è thread-safe in Java.
Q # 5)Qual è HashMap o ConcurrentHashMap più veloce?
Risposta: HashMap è più veloce di ConcurrentHashMap. Il motivo è che HashMap funziona solitamente su un solo thread, quindi le sue prestazioni sono buone. HashMap simultaneo, tuttavia, come suggerisce il nome, è simultaneo e può funzionare contemporaneamente su più thread.
Conclusione
In questo tutorial, abbiamo compreso il funzionamento di HashMap insieme a un'altra variante di HashMap chiamata ConcurrentHashMap. Abbiamo visto costruttori, metodi ed esempi di HashMap. Abbiamo anche discusso di ConcurrentHashMap insieme al suo esempio.
Nei nostri prossimi tutorial, impareremo di più sulle raccolte Java.
=> Controlla qui per vedere qui i tutorial di formazione su Java dalla A alla Z.
Lettura consigliata
- LinkedHashMap in Java - Esempio e implementazione di LinkedHashMap
- Tutorial JAVA per principianti: oltre 100 tutorial video Java pratici
- TreeMap in Java - Tutorial con esempi di Java TreeMap
- Cos'è Java Vector | Tutorial Java Vector Class con esempi
- Tutorial sul metodo Java String contains () con esempi
- Come ordinare un array in Java - Tutorial con esempi
- Jagged Array in Java - Tutorial con esempi
- Tutorial di classe per scanner Java con esempi