what is hashmap java
Denne Java HashMap-vejledning forklarer, hvad der er et HashMap i Java, og hvordan man bruger det. Det inkluderer Sådan erklæres, initialiseres, gentages, implementeres og udskrives HashMap:
HashMap i Java er en samling baseret på Map og består af nøgleværdipar. En HashMap betegnes med eller. Et HashMap-element kan tilgås ved hjælp af en nøgle, dvs. vi skal kende nøglen for at få adgang til HashMap-elementet.
En HashMap bruger en teknik kaldet “Hashing”. I hashing konverteres en længere streng til en kortere streng ved at anvende en eller anden algoritme eller 'hash-funktion'. En streng konverteres til en kortere streng, da den hjælper med at søge hurtigere. Det bruges også til effektiv indeksering.
=> Besøg her for den eksklusive Java-træningsundervisningsserie.
Hvad du lærer:
- HashMap i Java
- Java Map Vs HashMap
- Konklusion
HashMap i Java
En HashMap svarer til HashTable med en forskel, at HashMap ikke er synkroniseret og tillader nulværdier for nøgle og værdi.
Nogle af de vigtige egenskaber ved HashMap er angivet nedenfor:
- HashMap implementeres i Java i klassen “Hashmap”, der er en del af java.util-pakken.
- HashMap-klassen arver fra klassen 'AbstractMap', der delvist implementerer Map-grænsefladen.
- HashMap implementerer også 'klonable' og 'serialiserbare' grænseflader.
- HashMap tillader duplikatværdier, men tillader ikke duplikatnøgler. HashMap tillader også flere nulværdier, men en nulnøgle kan kun være en.
- HashMap er usynkroniseret og garanterer heller ikke rækkefølgen af elementerne.
- Java HashMap-klassen har en startkapacitet på 16, og standardbelastningsfaktoren (initial) er 0,75.
Hvordan man erklærer et HashMap i Java?
En HashMap i Java er en del af java.util-pakken. Derfor, hvis vi har brug for HashMap i vores kode, skal vi først importere implementeringsklassen ved hjælp af et af følgende udsagn:
import java.util.*;
ELLER
import java.util.HashMap;
Den generelle erklæring om HashMap-klassen er:
public class HashMap extends AbstractMap implements Map, Cloneable, Serializable
Her er K => type nøgler, der findes på kortet
V => type værdier tilknyttet tasterne på kortet
Opret et HashMap
En HashMap i Java kan oprettes som følger:
import java.util.HashMap; HashMap cities_map = new HashMap ();
Ovenstående erklæring inkluderer først HashMap-klassen i Java. Derefter opretter vi i den næste erklæring et HashMap med navnet 'towns_map' med nøgletype som heltal og værdier som streng.
Når HashMap er oprettet, skal vi initialisere det med værdier.
Sådan initialiseres Hash-kort?
Vi kan initialisere HashMap ved hjælp af put-metoden ved at sætte nogle værdier på kortet.
Nedenstående program viser initialiseringen af HashMap i 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()); } } }
Produktion:
Indledende kort: {}
Efter tilføjelse af elementer:
100 Netværk
101 Grøn
102 Blå
Hvordan fungerer et HashMap internt?
Vi ved, at HashMap er en samling af nøgleværdipar, og det bruger en teknik kaldet 'Hashing'. Internt er HashMap en række noder. HashMap bruger array og LinkedList til lagring af nøgleværdipar.
Nedenfor er en struktur af en node af HashMap, der er programmatisk repræsenteret som en klasse.
Som det ses fra nodeafbildningen ovenfor, har en node en struktur svarende til en linket listeknude. En række af disse noder kaldes Bucket. Hver spand har muligvis ikke den samme kapacitet, og den kan også have mere end en node.
Udførelsen af HashMap påvirkes af to parametre:
(i) Startkapacitet: Kapacitet er defineret som antallet af spande i HashMap. Startkapacitet defineres som kapaciteten for HashMap-objektet, når det oprettes. HashMaps kapacitet ganges altid med 2.
(ii) LoadFactor: LoadFactor er den parameter, der måles under genopvaskning - udvidelse af kapaciteten vil blive udført.
Bemærk, at hvis kapaciteten er høj, vil belastningsfaktoren være lille, da der ikke kræves genopvaskning. På samme måde, når kapaciteten er lav, vil belastningsfaktoren være høj, da vi bliver nødt til at vaske ofte. Derfor skal vi udvise omhu for nøje at vælge disse to faktorer for at designe et effektivt hashMap.
Sådan gentages et HashMap?
HashMap skal gennemkøres for at manipulere eller udskrive nøgleværdiparene.
Der er to måder, hvorpå vi kan krydse eller gentage gennem HashMap.
- Brug for loop
- Brug af while-sløjfen og iteratoren.
Java-programmet nedenfor viser implementeringen af begge disse metoder.
Først henter vi sættet af poster fra HashMap ved hjælp af entrySet-metoden, og derefter krydser vi sættet ved hjælp af for loop. Derefter udskriver vi nøgleværdiparene ved hjælp af henholdsvis getKey () og getValue () -metoderne.
For at krydse HashMap ved hjælp af en while-loop skal vi først indstille en iterator til HashMap og derefter få adgang til nøgleværdiparene ved hjælp af iteratoren.
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()); } } }
Produktion:
HashMap bruger til Loop:
NØGLEVÆRDI
1 DL
3 LANG
20 PUN
7 GOA
10 MUM
HashMap ved brug af mens Loop:
NØGLEVÆRDI
1 DL
3 LANG
20 PUN
7 GOA
10 MUM
Udskriv et hash-kort
Lad os se et andet eksempel på udskrivning af hashMap ved hjælp af foreach-sløjfen vist i nedenstående program.
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)); } } }
Produktion:
HashMap indhold:
NØGLEVÆRDI
Netværk 1
Magenta 8
Orange 5
HashMap-konstruktør / -metoder i Java
Nedenstående tabeller viser konstruktører og metoder leveret af HashMap-klassen i Java.
Konstruktører
Konstruktør prototype | Beskrivelse | |
---|---|---|
sæt alt | void putAll (Kortkort) | Indsætter specificerede 'kort'-elementer i HashMap. |
HashMap () | Standardkonstruktør. | |
HashMap (kort m) | Opretter et nyt HashMap fra det givne kortobjekt m. | |
HashMap (int kapacitet) | Opretter en ny HashMap med den oprindelige kapacitet givet af argumentet 'kapacitet'. | |
HashMap (int-kapacitet, float loadFactor) | Opretter et nyt HashMap ved hjælp af værdierne kapacitet og loadFactor leveret af konstruktøren. |
Metoder
Metode | Metode Prototype | Beskrivelse |
---|---|---|
klar | ugyldigt klart () | Rydder alle kortlægningerne i HashMap |
er tom | boolsk isEmpty () | Kontrollerer, om HashMap er tom. Returnerer sandt, hvis ja. |
klon | Objektklon () | Returnerer en lav kopi uden at klone nøglerne og værditilknytningerne i HashMap. |
entrySet | Indstil entrySet () | Returnerer tilknytninger i HashMap som en samling |
nøglesæt | Indstil nøgleSæt () | Returnerer et sæt nøgler i HashMap. |
sætte | V put (Objektnøgle, Objektværdi) | Indsætter en nøgleværdipost i HashMap. |
putIfAbsent | V putIfAbsent (K-tast, V-værdi) | Indsætter givet nøgleværdipar i HashMap, hvis det ikke allerede er til stede. |
fjerne | V fjern (Objektnøgle) | Slet en post fra HashMap for den givne nøgle. |
fjerne | boolsk fjernelse (Objektnøgle, Objektværdi) | Sletter det givne nøgleværdipar fra HashMap. |
beregne | V beregne (K-tast, BiFunction remappingFunction) | Beregner kortlægning ved hjælp af 'remapping-funktion' for den givne nøgle og dens aktuelle værdi eller nulværdi. |
Metode | Metode Prototype | Beskrivelse |
ComputeIfAbsent | V computeIfAbsent (K-tast, Function mappingFunction) | Beregner kortlægningen ved hjælp af 'mappingFunction' og indsætter nøgleværdipar, hvis den ikke allerede er til stede eller er nul. |
computeIfPresent | V computeIfPresent (K-tast, BiFunction remappingFunction) | Beregner en ny kortlægning ved hjælp af 'remappingFunction' givet nøglen, hvis nøglen allerede er til stede og ikke-nul. |
indeholder værdi | boolean containValue (objektværdi) | Kontrollerer, om den givne værdi findes i HashMap, og returnerer sand, hvis ja. |
indeholderKey | boolean containKey (Objektnøgle) | Kontrollerer, om den givne nøgle er til stede i HashMap og returnerer sand, hvis ja. |
lige med | boolske lig (Objekt o) | Sammenligner givet objekt med HashMap. |
for hver | ugyldig for hver (BiConsumer-handling) | Udfører givet 'handling' for hver af posterne i HashMap. |
få | V get (Objektnøgle) | Returnerer objektet, der indeholder den givne nøgle med den tilknyttede værdi. |
getOrDefault | V getOrDefault (Objektnøgle, V standardværdi) | Returnerer den værdi, som den givne nøgle er kortlagt til. Hvis den ikke er kortlagt, returneres standardværdien. |
er tom | boolsk isEmpty () | Kontrollerer, om HashMap er tom. |
gå | V flette (K-tast, V-værdi, BiFunction remappingFunction) | Kontrollerer, om den givne nøgle er nul eller ikke associeret med værdi, og knytter den derefter til en ikke-nul-værdi ved hjælp af remappingFunction. |
erstatte | V erstat (K-tast, V-værdi) | Erstatter den givne værdi for den angivne nøgle. |
erstatte | boolsk erstatning (K-tast, V oldValue, V newValue) | Erstatter den gamle værdi af den givne nøgle med den nye værdi |
udskift alle | ugyldig erstatte alle (BiFunction-funktion) | Udfører den givne funktion og erstatter alle værdier i HashMap med funktionsresultatet. |
værdier | Samlingsværdier () | Returnerer samlingen af værdier, der findes i HashMap. |
størrelse | int størrelse () | Returnerer størrelsen på antallet af poster i HashMap. |
Hashmap-implementering
Dernæst implementerer vi de fleste af disse funktioner i et Java-program for at forstå, hvordan de fungerer bedre.
Følgende Java-program viser en implementering af HashMap i Java. Bemærk, at vi har brugt de fleste af de metoder, som vi diskuterede ovenfor.
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() ); } } }
Produktion:
HashMap indhold:
NØGLEVÆRDI
49 Lilje
2 Sevilla
3 Dillon
7 Lacy
12 Leo
Værdi ved indeks 2 er: Sevilla
Hashmap efter fjernelse:
NØGLEVÆRDI
49 Lilje
2 Sevilla
7 Lacy
12 Leo
Sorter HashMap i Java
I Java bevarer HashMap ikke ordren. Derfor er vi nødt til at sortere elementerne i HashMap. Vi kan sortere elementerne i HashMap enten baseret på nøgler eller værdier. I dette afsnit vil vi diskutere begge sorteringsmetoder.
Sorter HashMap efter taster
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()); } } }
Produktion:
Usorteret HashMap:
1: Netværk
3: Grøn
5: Blå
7: Cyan
23: Brun
9: Magenta
11: Gul
HashMap sorteret efter taster:
1: Netværk
3: Grøn
5: Blå
7: Cyan
9: Magenta
11: Gul
23: Brun
I ovenstående program ser vi, at når hashmap er defineret og udfyldt med værdier, opretter vi et treemap fra dette hashmap. Da hashmap konverteres til et treemap, sorteres dets nøgler automatisk. Så når vi viser dette trækort, får vi det sorterede kort på tasterne.
Sorter HashMap efter værdier
For at sortere et HashMap efter værdier konverterer vi først hashmap til en LinkedList. Derefter bruger vi metoden Collections.sort sammen med komparatoren til at sortere listen. Denne liste konverteres derefter tilbage til HashMap. Den sorterede HashMap udskrives derefter.
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; } }
Produktion:
Usorteret HashMap:
1: V
3: Jeg
5: B
7: G
9: og
11: O
13: R
HashMap sorteret efter værdier:
5: B
7: G
3: Jeg
11: O
13: R
1: V
9: og
Samtidig HashMap i Java
I normal HashMap vil vi ikke være i stand til at ændre elementerne ved kørsel eller mens iteration udføres.
Implementeringen af et samtidigt kort er vist nedenfor:
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); } }
Produktion:
Indledende ConcurrentHashMap: {1 = 10, 2 = 10, 3 = 10, 4 = 10, 5 = 10, 6 = 10}
ConcurrentHashMap efter iterator: {1 = 10, 2 = 10, 3 = 10, 4 = 10, 5 = 10, 6 = 10, 3c_map = c_map}
Bemærk, at hvis vi havde udført den samme operation med HashMap, ville det have kastet ConcurrentModificationException.
Java Map Vs HashMap
Lad os tabulere nogle af forskellene mellem Map og HashMap i Java.
Kort | HashMap |
---|---|
Det er en abstrakt grænseflade. | Er en implementering af Map interface. |
Interfacet skal implementeres af andre klasser for at dets funktionalitet skal være tilgængelig. | Er en konkret klasse, og der kan oprettes klasseobjekter for at få funktionaliteten. |
Kortgrænsefladesimplementering som TreeMap tillader ikke nulværdier. | Tillader nulværdier og nøgler. |
TreeMap tillader ikke duplikatværdier. | Det kan have duplikatværdier. |
En naturlig rækkefølge af genstande opretholdes. | Ingen inputordre opretholdes i HashMap. |
Ofte stillede spørgsmål
Q # 1) Hvorfor bruges HashMap i Java?
Svar: HashMap, der er indsamlingen af nøgleværdipar, hjælper med at søge i data baseret på nøglen alene. Også da det bruger hashing-teknikker, giver det en effektiv opslag af data.
Q # 2)Hvordan opretter du et hash-kort?
forskel mellem adræt og vandfaldstest
Svar: En HashMap kan oprettes ved at starte klassen 'HashMap' i java.util-pakken. Et hashMap med nøgler af typen heltal og værdierne for typestrengen kan oprettes som følger:
HashMap myMap= new HashMap();
Q # 3)Er HashMap bestilt i Java?
Svar: Nej, HashMap er ikke bestilt i Java. Det bruges ikke i Java til dette formål, men bruges til lagring af elementer i nøgleværdipar.
Q # 4)Er HashMap trådsikker?
Svar: NEJ, hashMap er ikke trådsikker i Java.
Q # 5)Hvilket er hurtigere HashMap eller ConcurrentHashMap?
Svar: HashMap er hurtigere end ConcurrentHashMap. Årsagen er, at HashMap normalt kun fungerer på en tråd, så dens ydeevne er god. Samtidig HashMap er imidlertid, som navnet antyder, samtidig og kan arbejde samtidigt på flere tråde.
Konklusion
I denne vejledning forstod vi funktionen af HashMap sammen med en anden variant af HashMap kaldet ConcurrentHashMap. Vi har set konstruktører, metoder og eksempler på HashMap. Vi diskuterede også ConcurrentHashMap sammen med dets eksempel.
I vores kommende tutorials lærer vi mere om Java-samlinger.
=> Tjek her for at se AZ af Java-træningsvejledninger her.
Anbefalet læsning
- LinkedHashMap i Java - LinkedHashMap Eksempel og implementering
- JAVA-vejledning til begyndere: 100+ praktiske Java-videovejledninger
- TreeMap I Java - Vejledning med Java TreeMap-eksempler
- Hvad er Java Vector | Java Vector Class Tutorial med eksempler
- Java String indeholder () Metodevejledning med eksempler
- Sådan sorteres en matrix i Java - vejledning med eksempler
- Jagged Array In Java - Vejledning med eksempler
- Java Scanner-klassevejledning med eksempler