what is hashmap java
Aquest tutorial de Java HashMap explica què és un HashMap a Java i com s'utilitza. Inclou Com declarar, inicialitzar, iterar, implementar i imprimir HashMap:
HashMap a Java és una col·lecció basada en Map i consisteix en parells valor-clau. Un HashMap es denota amb o. Es pot accedir a un element HashMap mitjançant una clau, és a dir, hem de conèixer la clau per accedir a l’element HashMap.
Un HashMap utilitza una tècnica anomenada 'Hashing'. En el hash, una cadena més llarga es converteix en una cadena més curta aplicant algun algorisme o 'funció hash'. Una cadena es converteix en una cadena més curta, ja que ajuda a fer cerques més ràpides. També s’utilitza per a una indexació eficient.
=> Visiteu aquí la sèrie exclusiva de cursos de formació de Java.
Què aprendreu:
- HashMap a Java
- Java Map Vs HashMap
- Conclusió
HashMap a Java
Un HashMap és similar a HashTable amb una diferència que el HashMap no està sincronitzat i permet valors nuls per a la clau i el valor.
A continuació es detallen algunes de les característiques importants de HashMap:
- HashMap s’implementa a Java a la classe “Hashmap” que forma part del paquet java.util.
- La classe HashMap hereta de la classe 'AbstractMap' que implementa parcialment la interfície Map.
- HashMap també implementa interfícies 'clonables' i 'serialitzables'.
- HashMap permet valors duplicats, però no permet claus duplicades. HashMap també permet múltiples valors nuls, però una clau nul·la només pot ser un.
- HashMap no està sincronitzat i tampoc garanteix l'ordre dels elements.
- La classe Java HashMap té una capacitat inicial de 16 i el factor de càrrega (inicial) per defecte és 0,75.
Com es pot declarar un HashMap a Java?
Un HashMap a Java forma part del paquet java.util. Per tant, si hem d’utilitzar HashMap al nostre codi, primer hem d’importar la classe d’implementació mitjançant una de les afirmacions següents:
import java.util.*;
O
import java.util.HashMap;
La declaració general de la classe HashMap és:
public class HashMap extends AbstractMap implements Map, Cloneable, Serializable
Aquí, K => tipus de tecles presents al mapa
V => tipus de valors assignats a les tecles del mapa
Creeu un HashMap
Es pot crear un HashMap a Java de la següent manera:
import java.util.HashMap; HashMap cities_map = new HashMap ();
La declaració anterior inclou primer la classe HashMap a Java. A continuació, a la següent declaració, crearem un HashMap anomenat 'cities_map' amb el tipus de clau com a enter i Valors com a cadena.
Un cop creat el HashMap, hem d’inicialitzar-lo amb valors.
Com inicialitzar el mapa Hash?
Podem inicialitzar el HashMap mitjançant el mètode put posant alguns valors al mapa.
El programa següent mostra la inicialització de HashMap a 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()); } } }
Sortida:
Mapa inicial: {}
Després d'afegir elements:
100 Xarxa
101 Verd
102 Blau
Com funciona un HashMap internament?
Sabem que HashMap és una col·lecció de parells clau-valor i que fa ús d’una tècnica anomenada ‘Hashing’. Internament, el HashMap és una matriu de nodes. HashMap fa ús de matriu i LinkedList per emmagatzemar parells clau-valor.
A continuació es mostra una estructura d’un node de HashMap que es representa per programació com a classe.
Com es veu a la representació del node anterior, un node té una estructura similar a un node de llista enllaçat. Un conjunt d’aquests nodes s’anomena Bucket. És possible que cada cub no tingui la mateixa capacitat i també pugui tenir més d’un node.
El rendiment de HashMap està influït per dos paràmetres:
(i) Capacitat inicial: La capacitat es defineix com el nombre de dipòsits al HashMap. La capacitat inicial es defineix com la capacitat de l'objecte HashMap quan es crea. La capacitat del HashMap sempre es multiplica per 2.
(ii) LoadFactor: LoadFactor és el paràmetre que mesura quan es realitza el refat: es farà augmentant la capacitat.
Tingueu en compte que si la capacitat és elevada, el factor de càrrega serà petit, ja que no es necessitarà cap remenat. De la mateixa manera, quan la capacitat sigui baixa, el factor de càrrega serà elevat, ja que haurem de tornar a fer freqüentment. Per tant, hem de tenir cura de triar acuradament aquests dos factors per dissenyar un hashMap eficient.
Com es pot iterar un HashMap?
Cal recórrer el HashMap per manipular o imprimir els parells clau-valor.
Hi ha dues maneres en què podem recórrer-la o recórrer-la a través del HashMap.
- Utilitzant el bucle
- Utilitzant el bucle while i l’iterador.
El programa Java següent mostra la implementació d’aquests dos mètodes.
En primer lloc, recuperem el conjunt d’entrades de HashMap mitjançant el mètode entrySet i, a continuació, recorrem el conjunt mitjançant el bucle for. A continuació, imprimim els parells clau-valor mitjançant els mètodes getKey () i getValue () respectivament.
Per recórrer el HashMap mitjançant un bucle while, primer establim un iterador per a HashMap i, a continuació, accedim als parells clau-valor mitjançant l’iterador.
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()); } } }
Sortida:
HashMap que s’utilitza per a Loop:
VALOR CLAU
1 DL
3 LLARG
20 PUN
7 GOA
10 MAMÀ
HashMap utilitzant while Loop:
VALOR CLAU
1 DL
3 LLARG
20 PUN
7 GOA
10 MAMÀ
Imprimeix un mapa hash
Vegem un altre exemple d’impressió del hashMap mitjançant el bucle foreach que es mostra al programa següent.
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)); } } }
Sortida:
Contingut de HashMap:
VALOR CLAU
xarxa gener
magenta 8
Taronja 5
Constructor / mètodes de HashMap a Java
Les taules següents mostren els constructors i els mètodes proporcionats per la classe HashMap a Java.
Constructors
Prototip de constructor | Descripció | |
---|---|---|
putAll | void putAll (mapa del mapa) | Insereix elements 'mapa' especificats al HashMap. |
HashMap () | Constructor per defecte. | |
HashMap (mapa m) | Crea un nou HashMap a partir de l'objecte de mapa donat m. | |
HashMap (capacitat int) | Crea un nou HashMap amb la capacitat inicial donada per l'argument 'capacitat'. | |
HashMap (capacitat int, factor de càrrega flotant) | Crea un nou HashMap utilitzant els valors de capacitat i loadFactor proporcionats pel constructor. |
Mètodes
Mètode | Mètode prototip | Descripció |
---|---|---|
clar | void clear () | Esborra totes les assignacions del HashMap |
està buit | boolean isEmpty () | Comprova si el HashMap està buit. Retorna cert si és afirmatiu. |
clonar | Clon d'objectes () | Retorna una còpia poc profunda sense clonar les tecles i els mapatges de valors al HashMap. |
entrySet | Estableix entrySet () | Retorna assignacions al HashMap com a col·lecció |
conjunt de claus | Estableix keySet () | Retorna un conjunt de claus al HashMap. |
posar | V put (clau d'objecte, valor d'objecte) | Insereix una entrada de valor-clau al HashMap. |
putIfAbsent | V putIfAbsent (clau K, valor V) | Insereix un parell clau-valor donat al HashMap si encara no està present. |
eliminar | Suprimeix V (clau d'objecte) | Suprimiu una entrada del HashMap per a la clau donada. |
eliminar | eliminar booleà (clau d'objecte, valor d'objecte) | Suprimeix el parell clau-valor del HashMap. |
calcular | Càlcul en V (tecla K, funció de mapatge de BiFunction) | Calcula el mapatge mitjançant la funció 'remappingfunction' per a la clau donada i el seu valor actual o valor nul. |
Mètode | Mètode prototip | Descripció |
computeIfAbsent | V computeIfAbsent (tecla K, funció assignació de funcions) | Calcula l'assignació mitjançant la funció 'mappingFunction' i insereix parells clau-valor si encara no és present o és nul. |
computeIfPresent | V computeIfPresent (tecla K, BiFunction remappingFunction) | Calcula una nova assignació mitjançant la funció 'remappingFunction' donada la clau si la clau ja és present i no és nul·la. |
contéValor | booleà contéValor (valor de l'objecte) | Comprova si el valor donat existeix al HashMap i torna cert si és afirmatiu. |
conté Clau | booleà contéKey (clau d'objecte) | Comprova si la clau donada està present al HashMap i torna si és veritable. |
és igual | booleà és igual (objecte o) | Compara l'objecte donat amb el HashMap. |
per cadascú | void forEach (acció BiConsumer) | Executa una 'acció' determinada per a cadascuna de les entrades del HashMap. |
aconseguir | V get (clau d'objecte) | Retorna l'objecte que conté la clau donada amb el valor associat. |
getOrDefault | V getOrDefault (clau d'objecte, V defaultValue) | Retorna el valor al qual està assignada la clau donada. Si no està assignat, retorna el valor per defecte. |
està buit | boolean isEmpty () | Comprova si el HashMap està buit. |
vaja | Fusió en V (tecla K, valor en V, funció de mapatge de BiFunció) | Comprova si la clau donada és nul·la o no associada amb un valor i, a continuació, l’associa amb un valor no nul mitjançant remappingFunction. |
substituir | Substitució V (tecla K, valor V) | Substitueix el valor donat per la clau especificada. |
substituir | reemplaçament booleà (clau K, V valor antic, V valor nou) | Substitueix el valor antic de la clau donada pel valor nou |
substituirTots | void replaceAll (funció BiFunction) | Executa la funció donada i substitueix tots els valors del HashMap pel resultat de la funció. |
valors | Valors de col·lecció () | Retorna la col·lecció de valors presents al HashMap. |
mida | int size () | Retorna la mida del nombre d'entrades al HashMap. |
Implementació de Hashmap
A continuació, implementarem la majoria d’aquestes funcions en un programa Java per entendre que funcionen millor.
El següent programa Java mostra una implementació de HashMap a Java. Tingueu en compte que hem utilitzat la majoria dels mètodes que hem comentat anteriorment.
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() ); } } }
Sortida:
Contingut de HashMap:
VALOR CLAU
49 Lliri
2 Sevilla
3 Dillon
7 Lacy
12 Leo
El valor de l’índex 2 és: Sevilla
Hashmap després de l'eliminació:
VALOR CLAU
49 Lliri
2 Sevilla
7 Lacy
12 Leo
convertir YouTube a mp4 d'alta qualitat
Ordeneu HashMap a Java
A Java, HashMap no conserva l'ordre. Per tant, hem d’ordenar els elements del HashMap. Podem ordenar els elements del HashMap en funció de claus o valors. En aquesta secció, analitzarem els dos enfocaments de classificació.
Ordena HashMap per claus
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()); } } }
Sortida:
HashMap sense classificar:
1: Xarxa
3: Verd
5: Blau
7: Cian
23: Marró
9: Magenta
11: Groc
HashMap ordenat per tecles:
1: Xarxa
3: Verd
5: Blau
7: Cian
9: Magenta
11: Groc
23: Marró
Al programa anterior, veiem que una vegada que el hashmap es defineix i s’omple de valors, creem un mapa d’arbre a partir d’aquest hashmap. A mesura que el hashmap es converteix en un mapa d’arbre, les seves claus s’ordenen automàticament. Així, quan mostrem aquest mapa d’arbre, obtenim el mapa ordenat a les tecles.
Ordena HashMap per valors
Per ordenar un HashMap segons valors, primer convertim el hashmap a LinkedList. A continuació, fem servir el mètode Collections.sort juntament amb el comparador per ordenar la llista. Aquesta llista es torna a convertir a HashMap. A continuació, s’imprimeix el HashMap ordenat.
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; } }
Sortida:
HashMap sense classificar:
1: V
3: Jo
5: B
7: G
9: I
11: O
13: R
HashMap ordenat per valors:
5: B
7: G
3: Jo
11: O
13: R
1: V
9: I
HashMap simultani a Java
Al HashMap normal, no podrem modificar els elements en temps d'execució ni mentre es realitza la iteració.
A continuació es mostra la implementació d’un mapa simultani:
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); } }
Sortida:
ConcurrentHashMap inicial: {1 = 10, 2 = 10, 3 = 10, 4 = 10, 5 = 10, 6 = 10}
ConcurrentHashMap després de l'iterador: {1 = 10, 2 = 10, 3 = 10, 4 = 10, 5 = 10, 6 = 10, 3c_map = c_map}
Tingueu en compte que si haguéssim realitzat la mateixa operació amb HashMap, hauria llançat ConcurrentModificationException.
Java Map Vs HashMap
Tabulem algunes de les diferències entre Map i HashMap a Java.
Mapa | HashMap |
---|---|
És una interfície abstracta. | És una implementació de la interfície Map. |
La interfície ha d’ésser implementada per altres classes perquè la seva funcionalitat estigui disponible. | És una classe concreta i es poden crear objectes de classe per obtenir la funcionalitat. |
La implementació de la interfície de mapa, com TreeMap, no permet valors nuls. | Permet valors i claus nuls. |
TreeMap no permet duplicar valors. | Pot tenir valors duplicats. |
Es manté un ordenament natural dels objectes. | No es manté cap ordre d’entrada a HashMap. |
Preguntes freqüents
P # 1) Per què s'utilitza HashMap a Java?
Resposta: HashMap és la col·lecció de parells clau-valor que ajuda a cercar les dades només en funció de la clau. A més, ja que utilitza tècniques de resum, proporciona una cerca eficient de dades.
Q # 2)Com es crea un mapa de hash?
Resposta: Es pot crear un HashMap instanciant la classe ‘HashMap’ del paquet java.util. Es pot crear un hashMap amb claus de tipus enter i valors de cadena de tipus de la següent manera:
HashMap myMap= new HashMap();
Q # 3)S'ha ordenat HashMap a Java?
Resposta: No, el HashMap no està ordenat a Java. No s’utilitza a Java amb aquest propòsit, sinó que s’utilitza per emmagatzemar elements en parells clau-valor.
Q # 4)És segur HashMap per a fils?
Resposta: NO, el hashMap no és apte per a fils a Java.
Q # 5)Què és més ràpid HashMap o ConcurrentHashMap?
Resposta: HashMap és més ràpid que ConcurrentHashMap. La raó és que HashMap només funciona en un fil, de manera que el seu rendiment és bo. HashMap simultani, però, com el seu nom indica, és simultani i pot funcionar simultàniament en diversos fils.
Conclusió
En aquest tutorial, hem entès el funcionament de HashMap juntament amb una altra variació de HashMap anomenada ConcurrentHashMap. Hem vist constructors, mètodes i exemples de HashMap. També vam discutir ConcurrentHashMap juntament amb el seu exemple.
Als nostres propers tutorials, aprendrem més sobre Java Collections.
=> Consulteu aquí per veure aquí A-Z de tutorials de formació.
Lectura recomanada
- LinkedHashMap a Java: exemple i implementació de LinkedHashMap
- Tutorial JAVA per a principiants: més de 100 tutorials pràctics de vídeo Java
- TreeMap a Java: tutorial amb exemples de Java TreeMap
- Què és Java Vector | Tutorial de Java Vector Class amb exemples
- Java String conté () Tutorial de mètode amb exemples
- Com ordenar una matriu a Java: tutorial amb exemples
- Matriu irregular a Java: tutorial amb exemples
- Tutorial de classe Java Scanner amb exemples