Tutorijali
hashmap og-cs

Kako se koristi HashMap u Javi

Java HashMap se koristi za spremanje podataka po principu key/value parova (ključ i vrijednost). Key se uvijek nalazi na prvom mjestu i mora biti jedinstven, dok se value može ponavljati. Riječ je o implementaciji klase koja predstavlja strukturu podataka (poznatu i kao mapa), kojom se na brz i jednostavan način može baratati s različitim podacima. Evo nekoliko primjera gdje možemo koristiti HashMap:

  • username, password
  • ime i prezime, e-mail
  • user ID, username

U jednom od prethodnih tutorijala radili smo s ArrayList. HashMap je sličan ArrayListi, što se najbolje vidi iz primjera.

HashMap<Integer, String> school = new HashMap<>();

Pozvali smo klasu HashMap koju smo nazvali school te unutar strelica definirali koji tip podatka će biti key, a koji će biti value. U našem slučaju to su Integer i String. Zatim smo pozvali new HashMap<>(), čime smo Javi dali do znanja kako želimo kreirati novi HashMap. Ako gore navedeni HashMap usporedimo s ArrayList, vidimo da je jedina razlika u dodatnom objektu unutar strelica. S tim se objektima označava koji tip podatka je key (uvijek je na prvom mjestu), a koji tip podatka će biti value. Pritom pripazite, jer treba koristiti Wrapper klasu podatka (umjesto int koristite Integer, umjesto float koristite Float, i sl.).

Sada u varijablu school možemo dodavati elemente odnosno keys i values. Budući da naziv varijable asocira na školu, mi ćemo za key koristiti redni broj u imeniku, a values će biti imena učenika. Dodavanje elemenata u HashMap radi se pomoću metode put().

school.put(1, "Gracija");
school.put(2, "Marina");
school.put(3, "Pavel");
school.put(4, "Suzi");

Ako u konzoli želimo prikazati sve HashMap elemente, na raspolaganju su nam dvije opcije. Obični System.out.println(school), ili for-each loop. For-each loop za HashMap izgleda ovako:

for (HashMap.Entry<Integer, String> entry: school.entrySet()) {
    System.out.println(entry);
}

U oba slučaja dobit ćemo ispis našeg HashMap, u kojem su keys i values razdvojeni znakom jednakosti. Zbog toga je manipulacija podacima unutar HashMap prilično jednostavna, što ćete vidjeti iz sljedećih primjera.

HashMap i korisne metode unutar nje

Već sam spomenuo metodu put(), pomoću koje dodajemo elemente u HashMap. Ako želimo pristupiti točno određenom elementu, to ćemo učiniti metodom get(). Ova metoda zahtijeva samo jedan parametar, a to je key elementa s kojim ćemo raditi. To je jedan od ključnih razloga zašto su keys jedinstveni i ne smiju se ponavljati.

System.out.println(school.get(2));

HashMap elemente mijenjamo metodom replace(). U ovom slučaju potrebno je pozvati key elementa kojeg mijenjamo, a zatim dodati novi value.

school.replace(3, "Jura");

Ovime smo value “Pavel” zamijenili s “Jura”. Key je ostao isti, ali je value promijenjen. Brisanje HashMap elemenata radi se metodom remove(), gdje je dovoljno pozvati samo key elementa.

Također postoji metoda clear(), s kojom brišemo sve HashMap elemente. Budite oprezni s ovom metodom kako ne biste izgubili važne podatke. Metoda size() pokazat će nam koliko elemenata naš HashMap ima.

System.out.println(school.size());

Korištenje različitih key/value kombinacija u HashMap

U prethodnom primjeru kao key smo koristili Integer, a value je bio String. HashMap, međutim, nije ograničen samo na ovu kombinaciju, jer različiti objekti mogu biti keys i values. U sljedećem primjeru kreirat ćemo novi HashMap, u kojem će String služiti i kao key i kao value.

HashMap<String, String> rockAlbums = new HashMap<>();

rockAlbums.put("High Voltage", "AC/DC");
rockAlbums.put("Physical Graffiti", "Led Zeppelin");
rockAlbums.put("Appetite for Destruction", "Guns 'n' Roses");
rockAlbums.put("Rock or Bust", "AC/DC");
rockAlbums.put("Led Zeppelin IV", "Led Zeppelin");
rockAlbums.put("Nevermind", "Nirvana");
rockAlbums.put("Burn", "Deep Purple");
rockAlbums.put("Back in Black", "AC/DC");
rockAlbums.put("The Crazy World of Arthur Brown", "Arthur Brown");
rockAlbums.put("Led Zeppelin", "Led Zeppelin");
rockAlbums.put("In Utero", "Nirvana");
rockAlbums.put("Under Lock and Key", "Dokken");
rockAlbums.put("Deep Purple in Rock", "Deep Purple");
rockAlbums.put("Ten", "Pearl Jam");

U ovom slučaju koristimo imena albuma kao key, dok su imena rock bendova spremljena kao values. Bilo bi praktičnije kada bismo koristili imena bendova kao keys, ali sjetimo se zašto to nije moguće – keys moraju biti jedinstveni. S obzirom da je HashMap rockAlbums znatno veći od school, teže je pronaći potrebne keys i values. U takvim slučajevima na raspolaganju su metode containsKey() i containsValue(), koje kao rezultat vraćaju true ili false. Jednak rezultat vraća metoda isEmpty(), kojom provjeravamo sadrži li naš HashMap elemente.

System.out.println(rockAlbums.containsValue("Dokken"));

S obzirom na velik broj elemenata, prilikom ispisa u konzoli može se primijetiti još jedno HashMap svojstvo. Ispis je nasumičan i ne drži se redoslijeda kojim smo unijeli key/value parove.

for (HashMap.Entry<String, String> entry: rockAlbums.entrySet())
	System.out.println(entry);

Ono što je ključno je povezanost kombinacije key/value i to smo dobili s HashMap. Pojedine elemente ćemo pronaći tražeći odgovarajući key ili value. Kada je bitna struktura i nepromjenjivost redoslijeda, tada je praktičnije koristiti ArrayList ili LinkedHashMap.

Ako želimo vidjeti samo keys ili samo values, moguće ih je pozvati pomoću odgovarajućih metoda. Keys ćemo prikazati metodom keySet().

for (String showKeys: rockAlbums.keySet()) {
	System.out.println(showKeys);
}

Ako želimo prikazati samo values, učinit ćemo to metodom values().

for (String showValues: rockAlbums.values()) {
	System.out.println(showValues);
}

Potrebno je napomenuti kako HashMap može sadržavati gotovo bilo koji objekt koji je instanca klase:

  • primitivne tipove podataka
  • String
  • objekte
  • liste, setove i ostale kolekcije.

Autor

Marko Lubar

Ova stranica koristi kolačiće da bi poboljšalo korisničko iskustvo, više o tome možete saznajte na našoj stranici "politika privatnosti"

Politika privatnosti