what is hashmap java
Tento výukový program Java HashMap vysvetľuje, čo je HashMap v prostredí Java a ako ho používať. Zahŕňa Ako deklarovať, inicializovať, iterovať, implementovať a tlačiť HashMap:
HashMap v Jave je kolekcia založená na mape a pozostáva z párov kľúč - hodnota. HashMap je označená alebo. K prvku HashMap je možné pristupovať pomocou kľúča, tj. Musíme poznať kľúč na prístup k prvku HashMap.
HashMap používa techniku zvanú „Hashing“. Pri hašovaní sa dlhší reťazec prevedie na kratší reťazec použitím nejakého algoritmu alebo „hashovacej funkcie“. Reťazec sa prevedie na kratší reťazec, pretože pomáha pri rýchlejšom vyhľadávaní. Používa sa tiež na efektívne indexovanie.
=> Navštívte tu sériu exkluzívnych výukových programov Java.
Čo sa dozviete:
- HashMap v jazyku Java
- Java Map Vs HashMap
- Záver
HashMap v jazyku Java
HashMap je podobný HashTable s tým rozdielom, že HashMap nie je synchronizovaný a umožňuje nulové hodnoty pre kľúč a hodnotu.
Niektoré dôležité charakteristiky HashMap sú uvedené nižšie:
- HashMap je implementovaný v Jave v triede „Hashmap“, ktorá je súčasťou balíka java.util.
- Trieda HashMap dedí z triedy „AbstractMap“, ktorá čiastočne implementuje rozhranie Mapy.
- HashMap tiež implementuje „klonovateľné“ a „sériovo použiteľné“ rozhrania.
- HashMap povoľuje duplicitné hodnoty, ale nepovoľuje duplicitné kľúče. HashMap tiež umožňuje viac nulových hodnôt, ale nulový kľúč môže byť iba jedna.
- HashMap je nesynchronizovaný a tiež nezaručuje poradie prvkov.
- Trieda Java HashMap má počiatočnú kapacitu 16 a predvolený (počiatočný) faktor zaťaženia je 0,75.
Ako deklarovať HashMap v Jave?
HashMap v jazyku Java je súčasťou balíka java.util. Preto, ak v našom kóde potrebujeme použiť HashMap, musíme najskôr importovať implementačnú triedu pomocou jedného z nasledujúcich príkazov:
import java.util.*;
ALEBO
import java.util.HashMap;
Všeobecné vyhlásenie o triede HashMap je:
public class HashMap extends AbstractMap implements Map, Cloneable, Serializable
Tu je typ K => kľúčov na mape
V => typ hodnôt namapovaných na kľúče na mape
Vytvorte HashMap
HashMap v Jave je možné vytvoriť nasledovne:
import java.util.HashMap; HashMap cities_map = new HashMap ();
Vyššie uvedené vyhlásenie najskôr obsahuje triedu HashMap v Jave. Potom v ďalšom vyhlásení vytvoríme HashMap s názvom „cities_map“ s typom kľúča ako Integer a Values ako String.
Po vytvorení mapy HashMap ju musíme inicializovať pomocou hodnôt.
Ako inicializovať hashovú mapu?
HashMap môžeme inicializovať pomocou metódy put vložením niektorých hodnôt do mapy.
Nasledujúci program zobrazuje inicializáciu HashMap v Jave.
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()); } } }
Výkon:
Úvodná mapa: {}
Po pridaní prvkov:
100 Sieť
101 zelená
102 modrá
Ako funguje HashMap interne?
Vieme, že HashMap je kolekcia párov kľúč - hodnota a využíva techniku nazvanú „Hashing“. Interne je HashMap radom uzlov. HashMap využíva pole a LinkedList na ukladanie párov kľúč - hodnota.
Ďalej je uvedená štruktúra uzla HashMap, ktorá je programovo znázornená ako trieda.
Ako je zrejmé z znázornenia uzla vyššie, uzol má štruktúru podobnú prepojenému uzlu zoznamu. Pole týchto uzlov sa nazýva Bucket. Každý segment nemusí mať rovnakú kapacitu a môže mať tiež viac ako jeden uzol.
Výkonnosť programu HashMap je ovplyvnená dvoma parametrami:
i) Počiatočná kapacita: Kapacita je definovaná ako počet segmentov v HashMap. Počiatočná kapacita je definovaná ako kapacita objektu HashMap pri jeho vytváraní. Kapacita HashMap sa vždy vynásobí 2.
ii) LoadFactor: LoadFactor je parameter, ktorý sa meria pri opätovnom premývaní - vykoná sa zvýšenie kapacity.
Upozorňujeme, že ak je kapacita vysoká, faktor zaťaženia bude malý, pretože nie je potrebné žiadne ďalšie premývanie. Podobne, keď je kapacita nízka, bude faktor zaťaženia vysoký, pretože budeme musieť často opakované umývanie. Preto by sme mali venovať pozornosť tomu, aby sme starostlivo vybrali tieto dva faktory, aby sme vytvorili efektívnu hashMapu.
Ako iterovať HashMap?
Na manipuláciu alebo tlač párov kľúč - hodnota je potrebné prejsť cez HashMap.
Existujú dva spôsoby, ako môžeme prechádzať alebo iterovať cez HashMap.
- Pomocou slučky for
- Pomocou while a iterátora.
Program Java uvedený nižšie ukazuje implementáciu oboch týchto metód.
Najprv načítame množinu záznamov z HashMap pomocou metódy entrySet a potom množinu prechádzame pomocou slučky for. Potom vytlačíme páry kľúč - hodnota pomocou metód getKey () a getValue ().
Aby sme prešli HashMap pomocou while cyklu, najskôr sme pre HashMap nastavili iterátor a potom pomocou iterátora pristupujeme k párom kľúč - hodnota.
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()); } } }
Výkon:
HashMap pre Loop:
KĽÚČOVÁ HODNOTA
1 DL
3 DLHÉ
20 PUN
7 GOA
10 MAMI
HashMap pomocou while Loop:
KĽÚČOVÁ HODNOTA
1 DL
3 DLHÉ
20 PUN
7 GOA
10 MAMI
Vytlačte si hashovaciu mapu
Pozrime sa na ďalší príklad tlače hashMap pomocou slučky foreach zobrazenej v nasledujúcom programe.
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)); } } }
Výkon:
Obsah HashMap:
KĽÚČOVÁ HODNOTA
Sieť 1
Purpurová 8
Oranžová 5
Konštruktor / metódy HashMap v jazyku Java
Nasledujúce tabuľky zobrazujú konštruktory a metódy poskytované triedou HashMap v Jave.
spoločnosti, kde pracujú s videohrami
Konštruktéri
Prototyp konštruktéra | Popis | |
---|---|---|
putAll | void putAll (Mapa mapa) | Vloží zadané prvky „mapy“ do mapy HashMap. |
HashMap () | Predvolený konštruktor. | |
HashMap (mapa m) | Vytvorí novú HashMapu z daného mapového objektu m. | |
HashMap (int kapacita) | Vytvorí novú HashMapu s počiatočnou kapacitou danou argumentom „kapacita“. | |
HashMap (int kapacita, float loadFactor) | Vytvorí nový HashMap pomocou hodnôt kapacity a loadFactor poskytnutých konštruktorom. |
Metódy
Metóda | Metóda Prototyp | Popis |
---|---|---|
jasný | prázdnota clear () | Vymaže všetky mapovania v HashMape |
je prázdny | boolean isEmpty () | Skontroluje, či je HashMapa prázdna. Ak áno, vráti hodnotu true. |
klon | Klon objektu () | Vráti plytkú kópiu bez klonovania priradení kľúčov a hodnôt v HashMap. |
entrySet | Nastaviť entrySet () | Vráti mapovania v HashMap ako kolekciu |
sada kľúčov | Set keySet () | Vráti sadu kľúčov v HashMape. |
dať | V put (kľúč objektu, hodnota objektu) | Vloží položku kľúč - hodnota do HashMap. |
putIfAbsent | V putIfAbsent (kľúč K, hodnota V) | Vloží daný pár kľúč - hodnota do HashMap, ak ešte nie je prítomný. |
odstrániť | V remove (kľúč objektu) | Odstráňte položku z HashMap pre daný kľúč. |
odstrániť | boolean remove (kľúč objektu, hodnota objektu) | Vymaže daný pár kľúč - hodnota z HashMap. |
vypočítať | Výpočet V (kláves K, BiFunction remappingFunction) | Vypočíta mapovanie pomocou funkcie „remappingfunction“ pre daný kľúč a jeho aktuálnu alebo nulovú hodnotu. |
Metóda | Metóda Prototyp | Popis |
computeIfAbsent | V computeIfAbsent (kláves K, Function mappingFunction) | Vypočíta mapovanie pomocou funkcie „mappingFunction“ a vloží páry kľúč - hodnota, ak ešte nie sú prítomné alebo sú nulové. |
computeIfPresent | V computeIfPresent (kláves K, BiFunction remappingFunction) | Vypočíta nové mapovanie pomocou funkcie „remappingFunction“ daného kľúča, ak je kľúč už prítomný a nenulový. |
containsValue | boolean containsValue (hodnota objektu) | Skontroluje, či daná hodnota existuje v HashMap a vráti hodnotu true, ak áno. |
obsahujeKey | boolean containsKey (kľúč objektu) | Skontroluje, či je daný kľúč v HashMape, a vráti hodnotu true, ak áno. |
rovná sa | boolean equals (Objekt o) | Porovná daný objekt s HashMap. |
pre každý | void forEach (BiConsumer action) | Vykoná danú „akciu“ pre každú z položiek v HashMape. |
dostať | V get (kľúč objektu) | Vráti objekt obsahujúci daný kľúč s priradenou hodnotou. |
getOrDefault | V getOrDefault (kľúč objektu, V defaultValue) | Vráti hodnotu, na ktorú je daný kľúč namapovaný. Ak nie je mapované, vráti predvolenú hodnotu. |
je prázdny | boolean isEmpty () | Skontroluje, či je HashMapa prázdna. |
choď | Zlúčenie V (kláves K, hodnota V, BiFunction remappingFunction) | Skontroluje, či je daný kľúč null alebo nie je spojený s hodnotou, a potom ho pomocou remappingFunction spojí s nenulovou hodnotou. |
vymeniť | V nahradiť (kláves K, hodnota V) | Nahradí danú hodnotu pre zadaný kľúč. |
vymeniť | boolovská zámena (kláves K, V oldValue, V newValue) | Nahradí starú hodnotu daného kľúča novou hodnotou |
nahradiť všetko | void replaceAll (funkcia BiFunction) | Vykoná danú funkciu a všetky hodnoty v HashMape nahradí výsledkom funkcie. |
hodnoty | Hodnoty zbierky () | Vráti kolekciu hodnôt prítomných v HashMape. |
veľkosť | veľkosť int () | Vráti veľkosť počtu záznamov v HashMape. |
Implementácia Hashmap
Ďalej implementujeme väčšinu týchto funkcií do programu Java, aby sme lepšie pochopili ich fungovanie.
Nasledujúci program Java ukazuje implementáciu HashMap v Jave. Upozorňujeme, že sme použili väčšinu metód, o ktorých sme hovorili vyššie.
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() ); } } }
Výkon:
Obsah HashMap:
KĽÚČOVÁ HODNOTA
49 Lily
2 Sevilla
3 Dillon
7 Lacy
12 Lev
Hodnota v indexe 2 je: Sevilla
Hashmapa po odstránení:
KĽÚČOVÁ HODNOTA
49 Lily
2 Sevilla
7 Lacy
12 Lev
Triedenie HashMap v Jave
V prostredí Java program HashMap nezachováva poradie. Preto musíme triediť prvky v HashMape. Elementy v HashMape môžeme triediť buď na základe kľúčov alebo hodnôt. V tejto časti si rozoberieme oba prístupy k triedeniu.
Zoraďte HashMap podľa klávesov
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()); } } }
Výkon:
Nezoradená mapa HashMap:
1: Sieť
3: Zelená
5: Modrá
7: Azúrová
23: Hnedá
9: Purpurová
11: Žltá
HashMap zoradené podľa kľúčov:
1: Sieť
3: Zelená
5: Modrá
7: Azúrová
9: Purpurová
11: Žltá
23: Hnedá
Vo vyššie uvedenom programe vidíme, že akonáhle je hashmapa definovaná a naplnená hodnotami, vytvoríme z tejto hashmapy treemapu. Pretože sa hashmapa prevádza na mapu stromov, jeho kľúče sa automaticky triedia. Keď teda zobrazíme túto mapu, dostaneme zoradenú mapu na klávesoch.
Zoraďte HashMap podľa hodnôt
Pre triedenie HashMap podľa hodnôt najskôr prevedieme hashmapu na LinkedList. Potom použijeme metódu Collections.sort spolu s komparátorom na zoradenie zoznamu. Tento zoznam sa potom prevedie späť na HashMap. Vytriedený HashMap sa potom vytlačí.
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; } }
Výkon:
Nezoradená mapa HashMap:
1: V
3: Ja
5: B
7: G
9: a
11: O
13: R
HashMap zoradené podľa hodnôt:
5: B
7: G
3: Ja
11: O
13: R
1: V
9: a
Súbežná HashMap v Jave
V normálnom HashMap nebudeme môcť upravovať prvky za behu programu alebo počas vykonávania iterácie.
Implementácia súbežnej mapy je uvedená nižšie:
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); } }
Výkon:
Initial ConcurrentHashMap: {1 = 10, 2 = 10, 3 = 10, 4 = 10, 5 = 10, 6 = 10}
ConcurrentHashMap po iterátore: {1 = 10, 2 = 10, 3 = 10, 4 = 10, 5 = 10, 6 = 10, 3c_map = c_map}
Všimnite si, že keby sme vykonali rovnakú operáciu s HashMap, potom by to vyhodilo ConcurrentModificationException.
Java Map Vs HashMap
Uveďme tabelarizáciu niektorých rozdielov medzi mapami a HashMapami v Jave.
Mapa | HashMap |
---|---|
Je to abstraktné rozhranie. | Je implementácia rozhrania mapy. |
Rozhranie musí byť implementované v iných triedach, aby bola k dispozícii jeho funkčnosť. | Je konkrétna trieda a triedy objekty môžu byť vytvorené, aby získali funkčnosť. |
Implementácia mapového rozhrania ako TreeMap neumožňuje nulové hodnoty. | Umožňuje nulové hodnoty a kľúče. |
TreeMap neumožňuje duplicitné hodnoty. | Môže mať duplicitné hodnoty. |
Zachováva sa prirodzené usporiadanie objektov. | V HashMap sa nezachováva žiadne poradie zadávania. |
často kladené otázky
Otázka č. 1) Prečo sa v jazyku Java používa program HashMap?
Odpoveď: HashMap ako kolekcia párov kľúč - hodnota pomáha pri vyhľadávaní údajov iba na základe kľúča. Pretože tiež používa hašovacie techniky, poskytuje efektívne vyhľadávanie údajov.
Otázka č. 2)Ako vytvoríte hashovaciu mapu?
Odpoveď: HashMap je možné vytvoriť inštanciou triedy „HashMap“ balíka java.util. HashMapu s kľúčmi typu integer a hodnotami typu string je možné vytvoriť nasledovne:
HashMap myMap= new HashMap();
Otázka č. 3)Je HashMap objednaný v Jave?
Odpoveď: Nie, HashMap nie je v Jave objednaný. Na tento účel sa v Jave nepoužíva, ale slúži na ukladanie prvkov do párov kľúč - hodnota.
Otázka č. 4)Je vlákno HashMap bezpečné?
Odpoveď: NIE, hashMap nie je v Jave bezpečný pre vlákna.
Otázka č. 5)Čo je rýchlejšie HashMap alebo ConcurrentHashMap?
Odpoveď: HashMap je rýchlejší ako ConcurrentHashMap. Dôvodom je, že HashMap pracuje zvyčajne iba na jednom vlákne, takže jeho výkon je dobrý. Súbežná HashMap je však, ako už názov napovedá, súbežná a môže pracovať súčasne na viacerých vláknach.
Záver
V tomto tutoriáli sme pochopili fungovanie HashMap spolu s ďalšou variáciou HashMap nazvanou ConcurrentHashMap. Videli sme konštruktory, metódy a príklady HashMap. Diskutovali sme tiež o ConcurrentHashMap spolu s jeho príkladom.
V našich pripravovaných návodoch sa dozvieme viac o zbierkach Java.
=> Tu nájdete A-Z výučbových kurzov Java.
Odporúčané čítanie
- LinkedHashMap v Jave - Príklad a implementácia LinkedHashMap
- Výukový program JAVA pre začiatočníkov: viac ako 100 praktických výučbových programov Java Video
- TreeMap In Java - návod s príkladmi Java TreeMap
- Čo je Java Vector | Výukový program Java Vector Class s príkladmi
- Java String obsahuje () Výukový program metód s príkladmi
- Ako zoradiť pole v Jave - návod s príkladmi
- Jagged Array In Java - návod s príkladmi
- Výukový program triedy skenerov Java s príkladmi