what is hashmap java
Ta vadnica Java HashMap pojasnjuje, kaj je HashMap v Javi in kako jo uporabljati. Vključuje Kako razglasiti, inicializirati, ponoviti, implementirati in natisniti HashMap:
HashMap v Javi je zbirka, ki temelji na zemljevidu in je sestavljena iz parov ključ-vrednost. HashMap je označen z ali. Do elementa HashMap je mogoče dostopati s ključem, tj. Za dostop do elementa HashMap moramo poznati ključ.
HashMap uporablja tehniko, imenovano 'razpršitev'. Pri zgoščevanju se daljši niz pretvori v krajši niz z uporabo nekega algoritma ali 'hash function'. Niz se pretvori v krajši niz, saj pomaga pri hitrejšem iskanju. Uporablja se tudi za učinkovito indeksiranje.
=> Obiščite tukaj za ekskluzivno serijo vadnic za učenje Java.
Kaj se boste naučili:
- HashMap v Javi
- Java Map vs HashMap
- Zaključek
HashMap v Javi
HashMap je podoben HashTable s to razliko, da HashMap ni sinhroniziran in omogoča ničelne vrednosti za ključ in vrednost.
Nekatere pomembne značilnosti HashMap-a so navedene spodaj:
- HashMap je na Javi implementiran v razredu “Hashmap”, ki je del paketa java.util.
- Razred HashMap podeduje od razreda »AbstractMap«, ki delno izvaja vmesnik Map.
- HashMap izvaja tudi vmesnike, ki jih je mogoče klonirati in serirati.
- HashMap dovoljuje podvojene vrednosti, vendar ne dovoljuje podvojenih ključev. HashMap omogoča tudi več ničelnih vrednosti, vendar je ničelni ključ lahko samo en.
- HashMap ni sinhroniziran in tudi ne zagotavlja vrstnega reda elementov.
- Razred Java HashMap ima začetno zmogljivost 16 in privzeti (začetni) faktor obremenitve je 0,75.
Kako razglasiti hash map v Javi?
HashMap v Javi je del paketa java.util. Če moramo v naši kodi uporabiti HashMap, moramo najprej uvesti izvedbeni razred z uporabo enega od naslednjih stavkov:
import java.util.*;
ALI
import java.util.HashMap;
Splošna izjava razreda HashMap je:
public class HashMap extends AbstractMap implements Map, Cloneable, Serializable
Tu je K => vrsta ključev na zemljevidu
V => vrsta vrednosti, preslikane v tipke na zemljevidu
Ustvari HashMap
HashMap v Javi lahko ustvarite na naslednji način:
import java.util.HashMap; HashMap cities_map = new HashMap ();
Zgornja izjava najprej vključuje razred HashMap v Javi. Nato v naslednji izjavi izdelamo HashMap z imenom 'maps_map' s tipom ključa kot celo število in vrednostmi kot niz.
Ko je HashMap ustvarjen, ga moramo inicializirati z vrednostmi.
Kako inicializirati zemljevid razprševanja?
HashMap lahko inicializiramo z uporabo metode put, tako da na zemljevid vnesemo nekatere vrednosti.
Spodnji program prikazuje inicializacijo HashMap v Javi.
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()); } } }
Izhod:
Začetni zemljevid: {}
Po dodajanju elementov:
100 Omrežje
101 Zelena
102 Modra
Kako HashMap deluje interno?
Vemo, da je HashMap zbirka parov ključ / vrednost in uporablja tehniko, imenovano 'razprševanje'. Notranjost je HashMap niz vozlišč. HashMap uporablja matriko in LinkedList za shranjevanje parov ključ / vrednost.
Spodaj je prikazana struktura vozlišča HashMap, ki je programsko predstavljeno kot razred.
Kot je razvidno iz zgornje predstavitve vozlišča, ima vozlišče strukturo, podobno vozlišču povezanega seznama. Niz teh vozlišč se imenuje vedro. Vsako vedro morda nima enake zmogljivosti in ima lahko tudi več vozlišč.
Na delovanje sistema HashMap vplivata dva parametra:
(i) Začetna zmogljivost: Kapaciteta je definirana kot število segmentov v HashMap-u. Začetna zmogljivost je definirana kot zmogljivost predmeta HashMap, ko je ustvarjen. Zmogljivost HashMap se vedno pomnoži z 2.
(ii) LoadFactor: LoadFactor je parameter, ki meri pri ponovnem vročanju - povečanje zmogljivosti bo izvedeno.
Upoštevajte, da če je zmogljivost velika, bo faktor obremenitve majhen, saj ne bo potrebno ponovnega vpenjanja. Če je zmogljivost nizka, bo faktor obremenitve visok, saj bomo morali pogosto preoblikovati. Zato moramo biti pozorni, da skrbno izberemo ta dva dejavnika za oblikovanje učinkovitega hashMap-a.
Kako ponoviti HashMap?
Za manipulacijo ali tiskanje parov ključ / vrednost je treba prehoditi HashMap.
Obstajata dva načina, kako lahko prehodimo ali ponovimo HashMap.
- Uporaba for zanke
- Uporaba zanke while in iteratorja.
Spodnji program Java prikazuje izvajanje obeh metod.
Najprej nabor vnosov pridobimo iz HashMap z uporabo metode entrySet, nato pa prehodimo niz z zanko for. Nato izpišemo pare ključ / vrednost z uporabo metod getKey () in getValue ().
Če želimo HashMap prečkati z zanko while, najprej nastavimo iterator za HashMap in nato z iteratorjem dostopamo do parov ključ / vrednost.
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()); } } }
Izhod:
HashMap z uporabo zanke:
KLJUČNA VREDNOST
1 DL
3 LONG
20 PUN
7 GOA
10 MAMA
HashMap s pomočjo while Loop:
KLJUČNA VREDNOST
1 DL
3 LONG
20 PUN
7 GOA
10 MAMA
Natisnite zemljevid razpršitve
Oglejmo si še en primer tiskanja hashMap z uporabo foreach zanke, prikazane v spodnjem 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)); } } }
Izhod:
Vsebina HashMap:
KLJUČNA VREDNOST
Omrežje 1
Magenta 8
Oranžna 5
Konstruktor / metode HashMap v Javi
Spodnje tabele prikazujejo konstruktorje in metode, ki jih ponuja razred HashMap v Javi.
Konstruktorji
Prototip konstruktorja | Opis | |
---|---|---|
putAll | void putAll (zemljevid zemljevida) | V HashMap vstavi določene elemente 'map'. |
HashMap () | Privzeti konstruktor. | |
HashMap (zemljevid m) | Ustvari nov HashMap iz danega predmeta zemljevida m. | |
HashMap (notranja zmogljivost) | Ustvari nov HashMap z začetno zmogljivostjo, podano z argumentom 'zmogljivost'. | |
HashMap (int zmogljivost, float loadFactor) | Ustvari nov HashMap z uporabo vrednosti zmogljivosti in loadFactor, ki jih zagotavlja konstruktor. |
Metode
Metoda | Prototip metode | Opis |
---|---|---|
jasno | prazno jasno () | Počisti vsa preslikave v HashMap-u |
je prazno | logična isEmpty () | Preveri, ali je HashMap prazen. Vrne true, če da. |
klon | Klon predmeta () | Vrne plitvo kopijo brez kloniranja preslikav ključev in vrednosti v HashMap-u. |
entrySet | Nastavi entrySet () | Vrne preslikave v HashMap-u kot zbirko |
nabor tipk | Nastavi keySet () | Vrne nabor ključev v HashMap. |
dal | V put (tipka predmeta, vrednost predmeta) | V HashMap vstavi vnos ključ-vrednost. |
putIfAbsent | V putIfAbsent (tipka K, vrednost V) | Vstavi dani par ključ-vrednost v HashMap, če še ni prisoten. |
Odstrani | V odstrani (predmetna tipka) | Izbrišite vnos iz HashMap za dani ključ. |
Odstrani | logično odstranjevanje (tipka predmeta, vrednost predmeta) | Izbriše dani par ključ-vrednost s HashMap. |
izračunati | V izračun (tipka K, BiFunction remappingFunction) | Izračuna preslikavo z uporabo 'funkcije preslikave' za dani ključ in njegovo trenutno vrednost ali nično vrednost. |
Metoda | Prototip metode | Opis |
computeIfAbsent | V computeIfAbsent (tipka K, preslikava funkcijFunction) | Izračuna preslikavo z uporabo 'mappingFunction' in vstavi pare ključ / vrednost, če še ni prisoten ali je ničen. |
computeIfPresent | V computeIfPresent (tipka K, BiFunction remappingFunction) | Izračuna novo preslikavo z uporabo funkcije 'remappingFunction', če je ključ že prisoten in ni nulen. |
vsebujeVrednost | boolean containsValue (vrednost predmeta) | Preveri, ali določena vrednost obstaja v HashMap-u, in vrne true, če da. |
vsebujeKljuč | boolean containsKey (tipka predmeta) | Preveri, ali je dani ključ prisoten v HashMap-u, in vrne true, če da. |
enako | logično enako (objekt o) | Primerja dani objekt s HashMapom. |
za vsakogar | void forEach (BiConsumer action) | Izvede dano 'dejanje' za vsakega od vnosov v HashMap. |
dobili | V get (tipka predmeta) | Vrne objekt, ki vsebuje dani ključ, s pripadajočo vrednostjo. |
getOrDefault | V getOrDefault (Tipka predmeta, V defaultValue) | Vrne vrednost, na katero je preslikan dani ključ. Če ni preslikana, vrne privzeto vrednost. |
je prazno | logična isEmpty () | Preveri, ali je HashMap prazen. |
pojdi | V spajanje (tipka K, vrednost V, BiFunction remappingFunction) | Preveri, ali je dani ključ ničen ali ni povezan z vrednostjo, in ga nato z remappingFunction poveže z ne-ničelno vrednostjo. |
zamenjati | V zamenjava (tipka K, vrednost V) | Nadomešča dano vrednost za navedeni ključ. |
zamenjati | logična zamenjava (tipka K, V oldValue, V newValue) | Nadomešča staro vrednost danega ključa z novo vrednostjo |
replaceAll | void replaceAll (funkcija BiFunction) | Izvede dano funkcijo in nadomesti vse vrednosti v HashMap z rezultatom funkcije. |
vrednote | Vrednosti zbirke () | Vrne zbirko vrednosti, prisotnih v HashMap. |
velikost | velikost int () | Vrne velikost števila vnosov v HashMap. |
Izvajanje Hashmapa
Nato bomo večino teh funkcij implementirali v program Java, da bomo bolje razumeli njihovo delovanje.
Naslednji program Java prikazuje izvajanje HashMap v Javi. Upoštevajte, da smo uporabili večino metod, o katerih smo govorili zgoraj.
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() ); } } }
Izhod:
Vsebina HashMap:
KLJUČNA VREDNOST
49 Lily
2 Sevilla
3 Dillon
7 Čipkasta
12 Lev
Vrednost pri indeksu 2 je: Sevilla
Hashmap po odstranitvi:
KLJUČNA VREDNOST
49 Lily
2 Sevilla
7 Čipkasta
12 Lev
Razvrsti HashMap v Javi
V Javi HashMap ne ohrani vrstnega reda. Zato moramo razvrstiti elemente v HashMap-u. Elemente v HashMap lahko razvrstimo bodisi na podlagi ključev ali vrednosti. V tem poglavju bomo obravnavali oba pristopa razvrščanja.
Razvrsti HashMap po tipkah
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()); } } }
Izhod:
Nerazvrščeni HashMap:
1: Omrežje
3: zelena
5: modra
7: Cyan
23: Rjava
9: Magenta
11: rumena
HashMap Razvrščeno po tipkah:
1: Omrežje
3: zelena
5: modra
7: Cyan
9: Magenta
11: rumena
23: Rjava
V zgornjem programu vidimo, da ko je hashmap definiran in napolnjen z vrednostmi, iz tega hashmapa ustvarimo drevesni zemljevid. Ko se hashmap pretvori v drevesni zemljevid, se njegovi ključi samodejno razvrstijo. Ko torej prikažemo ta drevesni zemljevid, dobimo razvrščen zemljevid na tipkah.
Razvrsti HashMap po vrednostih
Za razvrščanje HashMap-a glede na vrednosti najprej pretvorimo hashmap v LinkedList. Nato uporabimo metodo Collections.sort skupaj s primerjalnikom za razvrščanje seznama. Ta seznam se nato pretvori nazaj v HashMap. Nato se natisne razvrščena 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; } }
Izhod:
Nerazvrščeni HashMap:
1: V.
3: I
5: B
7: G
9: in
11: O.
13: R
HashMap razvrščen po vrednostih:
5: B
7: G
3: I
11: O.
13: R
1: V.
9: in
Sočasna HashMap v Javi
V običajnem HashMapu ne bomo mogli spreminjati elementov med izvajanjem ali med izvajanjem iteracije.
Izvajanje sočasnega zemljevida je prikazano spodaj:
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); } }
Izhod:
Začetni ConcurrentHashMap: {1 = 10, 2 = 10, 3 = 10, 4 = 10, 5 = 10, 6 = 10}
ConcurrentHashMap po iteratorju: {1 = 10, 2 = 10, 3 = 10, 4 = 10, 5 = 10, 6 = 10, 3c_map = c_map}
Upoštevajte, da če bi izvedli isto operacijo s HashMapom, bi vrgel ConcurrentModificationException.
Java Map vs HashMap
Poglejmo tabularno nekatere razlike med Map in HashMap v Javi.
Zemljevid | HashMap |
---|---|
Je abstraktni vmesnik. | Je izvedba vmesnika Map. |
Vmesnik morajo implementirati drugi razredi, da bo njegova funkcionalnost na voljo. | Je konkreten razred in predmete razreda lahko ustvarite, da dobite funkcionalnost. |
Izvedba vmesnika zemljevida, kot je TreeMap, ne dovoljuje ničelnih vrednosti. | Omogoča ničelne vrednosti in ključe. |
TreeMap ne dovoljuje podvojenih vrednosti. | Lahko ima podvojene vrednosti. |
Ohranja se naravno urejanje predmetov. | V HashMapu ni vzdrževan noben vrstni red vnosa. |
Pogosto zastavljena vprašanja
V # 1) Zakaj se HashMap uporablja v Javi?
Odgovor: HashMap, ki je zbirka parov ključ-vrednost, pomaga pri iskanju podatkov, ki temeljijo samo na ključu. Ker uporablja tehnike razprševanja, omogoča učinkovito iskanje podatkov.
kakšen je vaš pristop med testiranjem mobilnih aplikacij
Q # 2)Kako ustvarim zemljevid razprševanja?
Odgovor: HashMap lahko ustvarite s primerkom razreda ‘HashMap’ paketa java.util. HashMap s ključi celoštevilskega tipa in vrednostmi niza tipa lahko ustvarite na naslednji način:
HashMap myMap= new HashMap();
Q # 3)Ali je HashMap naročen v Javi?
Odgovor: Ne, HashMap ni naročen v Javi. V Java se v ta namen ne uporablja, ampak se uporablja za shranjevanje elementov v parih ključ / vrednost.
Q # 4)Je HashMap varno pred nitmi?
Odgovor: NE, hashMap v Javi ni varen za nit.
V # 5)Kaj je hitrejše HashMap ali ConcurrentHashMap?
Odgovor: HashMap je hitrejši od ConcurrentHashMap. Razlog je v tem, da HashMap običajno deluje samo z eno nitjo, zato je njegova zmogljivost dobra. Sočasno HashMap pa je, kot že ime pove, sočasno in lahko hkrati deluje na več nitih.
Zaključek
V tej vadnici smo razumeli delovanje HashMap skupaj z drugo različico HashMap, imenovano ConcurrentHashMap. Videli smo konstruktorje, metode in primere HashMap. O ConcurrentHashMap smo razpravljali tudi skupaj z njegovim primerom.
V naslednjih vajah bomo izvedeli več o zbirkah Java.
=> Tukaj si oglejte A-Z vadnic za učenje Java.
Priporočeno branje
- LinkedHashMap v Javi - primer in izvedba LinkedHashMap
- JAVA Vadnica za začetnike: 100+ praktičnih Javnih video vadnic
- TreeMap v Javi - Vadnica z primeri Java TreeMap
- Kaj je Java Vector | Vadnica Java Vector Class s primeri
- Java String vsebuje () Vadnico metode s primeri
- Kako razvrstiti polje v Javi - Vadnica s primeri
- Nazobčan niz v Javi - Vadnica s primeri
- Vadnica razreda Java Scanner Class z primeri