what is hashmap java
Tento výukový program Java HashMap vysvětluje, co je HashMap v Javě a jak jej používat. Zahrnuje Jak deklarovat, inicializovat, iterovat, implementovat a tisknout HashMap:
HashMap v Javě je kolekce založená na Mapě a skládá se z párů klíč – hodnota. HashMap je označen nebo. K prvku HashMap lze přistupovat pomocí klíče, tj. Musíme znát klíč pro přístup k prvku HashMap.
HashMap používá techniku zvanou „Hashing“. Při hašování se delší řetězec převede na kratší řetězec pomocí nějakého algoritmu nebo „hashovací funkce“. Řetězec se převede na kratší řetězec, protože pomáhá při rychlejším vyhledávání. Používá se také pro efektivní indexování.
=> Navštivte zde exkluzivní sérii výukových programů Java.
Co se naučíte:
- HashMap v Javě
- Java Map Vs HashMap
- Závěr
HashMap v Javě
HashMap je podobný HashTable s tím rozdílem, že HashMap není synchronizován a umožňuje hodnoty null pro klíč a hodnotu.
Níže jsou uvedeny některé důležité vlastnosti HashMap:
- HashMap je implementován v Javě ve třídě „Hashmap“, která je součástí balíčku java.util.
- Třída HashMap dědí z třídy „AbstractMap“, která částečně implementuje rozhraní Map.
- HashMap také implementuje „klonovatelná“ a „serializovatelná“ rozhraní.
- HashMap povoluje duplicitní hodnoty, ale nepovoluje duplicitní klíče. HashMap také umožňuje více hodnot null, ale klíč null může být pouze jedna.
- HashMap je nesynchronizovaný a také nezaručuje pořadí prvků.
- Třída Java HashMap má počáteční kapacitu 16 a výchozí (počáteční) faktor zatížení je 0,75.
Jak deklarovat HashMap v Javě?
HashMap v Javě je součástí balíčku java.util. Pokud tedy v našem kódu potřebujeme použít HashMap, musíme nejprve importovat implementační třídu pomocí jednoho z následujících příkazů:
import java.util.*;
NEBO
import java.util.HashMap;
Obecná deklarace třídy HashMap je:
public class HashMap extends AbstractMap implements Map, Cloneable, Serializable
Zde K => typ klíčů přítomných na mapě
V => typ hodnot mapovaných na klíče na mapě
Vytvořte HashMap
HashMap v Javě lze vytvořit následujícím způsobem:
import java.util.HashMap; HashMap cities_map = new HashMap ();
Výše uvedené prohlášení nejprve zahrnuje třídu HashMap v Javě. Pak v dalším příkazu vytvoříme HashMap s názvem „cities_map“ s typem klíče jako Integer a Values jako String.
Jakmile je HashMap vytvořen, musíme jej inicializovat pomocí hodnot.
Jak inicializovat Hash Map?
Můžeme inicializovat HashMap pomocí metody put vložením některých hodnot do mapy.
Níže uvedený program ukazuje inicializaci HashMap v Javě.
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ýstup:
Úvodní mapa: {}
Po přidání prvků:
100 Síť
101 zelená
102 modrá
Jak interně funguje HashMap?
Víme, že HashMap je kolekce párů klíč – hodnota a využívá techniky zvané „hashování“. Interně je HashMap pole uzlů. HashMap využívá pole a LinkedList pro ukládání párů klíč – hodnota.
Níže je uvedena struktura uzlu HashMap, který je programově reprezentován jako třída.
Jak je vidět z reprezentace uzlu výše, uzel má strukturu podobnou uzlu propojeného seznamu. Pole těchto uzlů se nazývá Bucket. Každý segment nemusí mít stejnou kapacitu a může mít také více než jeden uzel.
Výkon HashMap je ovlivněn dvěma parametry:
(i) Počáteční kapacita: Kapacita je definována jako počet segmentů v HashMap. Počáteční kapacita je definována jako kapacita objektu HashMap při jeho vytvoření. Kapacita HashMap se vždy vynásobí 2.
ii) LoadFactor: LoadFactor je parametr, který měří při opětovném promývání - provede se zvýšení kapacity.
Všimněte si, že pokud je kapacita vysoká, faktor zatížení bude malý, protože nebude nutné žádné opětovné promývání. Podobně, když je kapacita nízká, bude faktor zatížení vysoký, protože budeme muset často znovu umýt. Proto bychom měli věnovat pozornost tomu, abychom pečlivě vybrali tyto dva faktory, abychom navrhli efektivní hashMap.
Jak iterovat HashMap?
Aby bylo možné manipulovat nebo tisknout páry klíč – hodnota, je třeba projít HashMap.
Existují dva způsoby, kterými můžeme procházet nebo iterovat přes HashMap.
- Pomocí smyčky for
- Pomocí while smyčky a iterátoru.
Níže uvedený program Java ukazuje implementaci obou těchto metod.
Nejprve načteme sadu záznamů z HashMap pomocí metody entrySet a poté sadu projdeme pomocí smyčky for. Pak vytiskneme páry klíč – hodnota pomocí metod getKey () a getValue ().
Chcete-li procházet HashMap pomocí smyčky while, nejprve nastavíme iterátor pro HashMap a poté přistupujeme k párům klíč – hodnota pomocí iterátoru.
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ýstup:
HashMap pro Loop:
KLÍČOVÁ HODNOTA
1 DL
3 DLOUHÉ
20 PUN
7 GOA
10 MAM
HashMap pomocí while Loop:
KLÍČOVÁ HODNOTA
1 DL
3 DLOUHÉ
20 PUN
7 GOA
10 MAM
Vytiskněte hashovací mapu
Podívejme se na další příklad tisku hashMap pomocí smyčky foreach zobrazené v níže uvedeném programu.
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ýstup:
Obsah HashMap:
KLÍČOVÁ HODNOTA
Síť 1
Purpurová 8
Oranžová 5
Konstruktor / metody HashMap v Javě
Níže uvedené tabulky ukazují konstruktory a metody poskytované třídou HashMap v Javě.
Konstruktéři
Prototyp konstruktoru | Popis | |
---|---|---|
putAll | void putAll (Mapa mapy) | Vloží do mapy HashMap určené prvky „mapy“. |
HashMap () | Výchozí konstruktor. | |
HashMap (mapa m) | Vytvoří nový HashMap z daného mapového objektu m. | |
HashMap (int kapacita) | Vytvoří novou HashMap s počáteční kapacitou danou argumentem „kapacita“. | |
HashMap (int kapacita, float loadFactor) | Vytvoří nový HashMap pomocí hodnot kapacity a loadFactor poskytnutých konstruktorem. |
Metody
Metoda | Metoda Prototyp | Popis |
---|---|---|
Průhledná | prázdnota clear () | Vymaže všechna mapování v HashMap |
je prázdný | boolean isEmpty () | Zkontroluje, zda je HashMap prázdná. Vrátí true, pokud ano. |
klon | Klon objektu () | Vrátí mělkou kopii bez klonování mapování klíčů a hodnot v HashMap. |
entrySet | Set entrySet () | Vrátí mapování v HashMap jako kolekci |
sada klíčů | Set keySet () | Vrátí sadu klíčů v HashMap. |
dát | V put (klíč objektu, hodnota objektu) | Vloží položku klíč – hodnota do HashMap. |
putIfAbsent | V putIfAbsent (klíč K, hodnota V) | Vloží daný pár klíč – hodnota do HashMap, pokud již není přítomen. |
odstranit | V remove (klíč objektu) | Odstraňte položku z HashMap pro daný klíč. |
odstranit | boolean remove (klíč objektu, hodnota objektu) | Odstraní daný pár klíč – hodnota z HashMap. |
vypočítat | Výpočet V (klávesa K, funkce BiFunkce přemapování) | Vypočítá mapování pomocí funkce „remappingfunction“ pro daný klíč a jeho aktuální hodnotu nebo nulovou hodnotu. |
Metoda | Metoda Prototyp | Popis |
computeIfAbsent | V computeIfAbsent (klávesa K, funkce mapování funkcí) | Vypočítá mapování pomocí funkce „mappingFunction“ a vloží páry klíč – hodnota, pokud již nejsou k dispozici nebo mají hodnotu null. |
computeIfPresent | V computeIfPresent (klávesa K, BiFunction remappingFunction) | Vypočítá nové mapování pomocí funkce „remappingFunction“ dané klíče, pokud je klíč již přítomen a nenulový. |
containsValue | boolean containsValue (hodnota objektu) | Zkontroluje, zda daná hodnota existuje v HashMap a vrátí hodnotu true, pokud ano. |
containsKey | boolean containsKey (klíč objektu) | Zkontroluje, zda je daný klíč v HashMapu, a vrátí hodnotu true, pokud ano. |
rovná se | boolean se rovná (objekt o) | Porovná daný objekt s HashMap. |
pro každého | void forEach (BiConsumer action) | Provede danou akci pro každou položku v HashMap. |
dostat | V get (klíč objektu) | Vrátí objekt obsahující daný klíč s přidruženou hodnotou. |
getOrDefault | V getOrDefault (klíč objektu, V defaultValue) | Vrátí hodnotu, na kterou je daný klíč namapován. Pokud není mapováno, vrátí výchozí hodnotu. |
je prázdný | boolean isEmpty () | Zkontroluje, zda je HashMap prázdná. |
jít | Sloučení V (klávesa K, hodnota V, funkce BiFunkce přemapování) | Zkontroluje, zda je daný klíč null nebo není spojen s hodnotou, a poté jej pomocí remappingFunction přidruží k nenulové hodnotě. |
nahradit | V nahradit (klíč K, hodnota V) | Nahradí danou hodnotu pro zadaný klíč. |
nahradit | boolean replace (klíč K, V oldValue, V newValue) | Nahradí starou hodnotu daného klíče novou hodnotou |
vyměnit vše | void replaceAll (funkce BiFunction) | Spustí danou funkci a nahradí všechny hodnoty v HashMap výsledkem funkce. |
hodnoty | Hodnoty kolekce () | Vrátí kolekci hodnot přítomných v HashMap. |
velikost | int velikost () | Vrátí velikost počtu položek v HashMap. |
Implementace Hashmap
Dále implementujeme většinu těchto funkcí do programu Java, abychom lépe porozuměli jejich fungování.
Následující program Java ukazuje implementaci HashMap v Javě. Všimněte si, že jsme použili většinu metod, které jsme diskutovali výše.
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ýstup:
Obsah HashMap:
KLÍČOVÁ HODNOTA
49 Lily
2 Sevilla
3 Dillon
7 Lacy
12 Lev
Hodnota v indexu 2 je: Sevilla
Hashmap po odstranění:
KLÍČOVÁ HODNOTA
49 Lily
2 Sevilla
7 Lacy
12 Lev
Řazení HashMap v Javě
V Javě nezachovává HashMap pořadí. Proto musíme třídit prvky v HashMap. Můžeme třídit prvky v HashMap buď na základě klíčů nebo hodnot. V této části probereme oba přístupy k třídění.
Seřadit HashMap podle klíčů
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ýstup:
Nezařazené HashMap:
1: Síť
3: Zelená
5: Modrá
7: Azurová
23: Hnědá
9: Purpurová
11: Žlutá
HashMap seřazené podle klíčů:
1: Síť
3: Zelená
5: Modrá
7: Azurová
9: Purpurová
11: Žlutá
23: Hnědá
Ve výše uvedeném programu vidíme, že jakmile je hashmapa definována a naplněna hodnotami, vytvoříme z této hashmapy treemapu. Vzhledem k tomu, že hashmap je převeden na mapu, jsou jeho klíče automaticky tříděny. Když tedy zobrazíme tuto mapu, dostaneme seřazenou mapu na klávesách.
seznam společností využívajících cloud computing
Seřadit HashMap podle hodnot
Pro třídění HashMap podle hodnot nejprve převedeme hashmapu na LinkedList. Potom použijeme metodu Collections.sort spolu s komparátorem k seřazení seznamu. Tento seznam se poté převede zpět na HashMap. Poté se vytiskne seřazená HashMap.
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ýstup:
Nezařazené HashMap:
1: V
3: Já
5: B
7: G
9: a
11: O.
13: R.
HashMap seřazený podle hodnot:
5: B
7: G
3: Já
11: O.
13: R.
1: V
9: a
Souběžná HashMap v Javě
V normálním HashMapu nebudeme moci upravovat prvky za běhu nebo během provádění iterace.
Níže je uvedena implementace souběžné mapy:
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ýstup:
Počáteční ConcurrentHashMap: {1 = 10, 2 = 10, 3 = 10, 4 = 10, 5 = 10, 6 = 10}
ConcurrentHashMap po iterátoru: {1 = 10, 2 = 10, 3 = 10, 4 = 10, 5 = 10, 6 = 10, 3c_map = c_map}
Všimněte si, že kdybychom provedli stejnou operaci s HashMap, pak by to vyvolalo ConcurrentModificationException.
Java Map Vs HashMap
Podívejme se na tabulku některých rozdílů mezi Map a HashMap v Javě.
Mapa | HashMap |
---|---|
Je to abstraktní rozhraní. | Je implementace rozhraní Map. |
Rozhraní musí být implementováno jinými třídami, aby byla k dispozici jeho funkčnost. | Je konkrétní třída a mohou být vytvořeny objekty třídy pro získání funkčnosti. |
Implementace mapového rozhraní jako TreeMap neumožňuje nulové hodnoty. | Umožňuje nulové hodnoty a klíče. |
TreeMap neumožňuje duplicitní hodnoty. | Může mít duplicitní hodnoty. |
Přirozené uspořádání objektů je zachováno. | V HashMapu není udržováno žádné pořadí zadávání. |
Často kladené otázky
Otázka č. 1) Proč se HashMap používá v Javě?
Odpovědět: HashMap jako kolekce párů klíč – hodnota pomáhá při vyhledávání dat na základě samotného klíče. Protože používá hashovací techniky, poskytuje efektivní vyhledávání dat.
Otázka č. 2)Jak vytvoříte hashovací mapu?
Odpovědět: HashMap lze vytvořit vytvořením instance třídy „HashMap“ balíčku java.util. HashMap s klíči typu integer a hodnotami typu string lze vytvořit následovně:
HashMap myMap= new HashMap();
Otázka č. 3)Je HashMap objednán v Javě?
Odpovědět: Ne, HashMap není v Javě objednán. Pro tento účel se v Javě nepoužívá, ale slouží k ukládání prvků do párů klíč – hodnota.
Otázka č. 4)Je vlákno HashMap bezpečné?
Odpovědět: NE, hashMap není v Javě bezpečný pro vlákna.
Otázka č. 5)Co je rychlejší HashMap nebo ConcurrentHashMap?
Odpovědět: HashMap je rychlejší než ConcurrentHashMap. Důvodem je, že HashMap pracuje obvykle pouze na jednom vlákně, takže jeho výkon je dobrý. Souběžná HashMap je však, jak název napovídá, souběžná a může pracovat současně na více vláknech.
Závěr
V tomto kurzu jsme pochopili fungování HashMap spolu s další variantou HashMap nazvanou ConcurrentHashMap. Viděli jsme konstruktory, metody a příklady HashMap. Také jsme diskutovali o ConcurrentHashMap spolu s jeho příkladem.
V našich připravovaných tutoriálech se dozvíme více o kolekcích Java.
=> Podívejte se sem a podívejte se na A-Z výukových kurzů Java zde.
Doporučené čtení
- LinkedHashMap v Javě - příklad a implementace LinkedHashMap
- Výukový program JAVA pro začátečníky: 100+ praktických výukových programů Java Video
- TreeMap v Javě - výuka s příklady Java TreeMap
- Co je Java Vector | Výukový program Java Vector Class s příklady
- Java String obsahuje () Výukový program metod s příklady
- Jak řadit pole v Javě - návod s příklady
- Jagged Array In Java - výukový program s příklady
- Výukový program třídy skeneru Java s příklady