Vodič za EnumMap

1. Pregled

EnumMap je Karta provedba koja isključivo traje Enum kao njegovi ključevi.

U ovom uputstvu razgovarat ćemo o njegovim svojstvima, uobičajenim slučajevima upotrebe i kada bismo ga trebali koristiti.

2. Postavljanje projekta

Zamislite jednostavan zahtjev u kojem trebamo mapirati dane u tjednu sa sportom kojim se tog dana bavimo:

Ponedjeljak Nogomet Utorak Košarka Srijeda Pješačenje Četvrtak Karate 

Za ovo bismo mogli koristiti enum:

javni popis Dan nedjelje {PONEDJELJAK, UTORAK, SRIJEDA, ČETVRTAK, PETAK, SUBOTA, NEDJELJA}

Što ćemo uskoro vidjeti, bit će ključno za našu kartu.

3. Stvaranje

Za početak istraživanja EnumMap, prvo ćemo morati instancirati jedan:

EnumMap ActivityMap = novi EnumMap (DayOfWeek.class); ActivityMap.put (DayOfWeek.MONDAY, "Soccer"); 

I evo naše prve razlike prema nečemu uobičajenijem, poput HashMap. Imajte na umu da sa HashMap, parametrizacija tipa je dovoljna, što znači da se možemo izvući nova HashMap (). Međutim, EnumMap zahtijeva tip ključa u konstruktoru.

3.1. EnumMap Konstruktor kopija

EnumMap također se isporučuje s dva konstruktora za kopiranje. Prva uzima drugu EnumMap:

EnumMap ActivityMap = novi EnumMap (DayOfWeek.class); ActivityMap.put (DayOfWeek.MONDAY, "Soccer"); ActivityMap.put (DayOfWeek.UTORAK, "Košarka"); EnumMap activityMapCopy = novi EnumMap (dayMap); assertThat (ActivityMapCopy.size ()). isEqualTo (2); assertThat (activityMapCopy.get (DayOfWeek.MONDAY)). isEqualTo ("Soccer"); assertThat (activityMapCopy.get (DayOfWeek.TUESDAY)). isEqualTo ("Košarka");

3.2. Karta Konstruktor kopija

Ili, ako imamo neprazan Karta čiji je ključ enum, onda možemo i to:

Mapa obična karta = nova HashMap (); plainMap.put (DayOfWeek.MONDAY, "Soccer"); EnumMap enumMap = novi EnumMap (obična karta); assertThat (enumMap.size ()). isEqualTo (1); assertThat (enumMap.get (DayOfWeek.MONDAY)). isEqualTo ("Soccer");

Imajte na umu da karta mora biti prazna, tako da EnumMap može odrediti tip ključa iz postojećeg unosa.

Ako navedena karta sadrži više od jednog tipa nabrajanja, konstruktor će baciti ClassCastException.

4. Dodavanje i preuzimanje elemenata

Nakon instanciranja datoteke EnumMap, možemo dodati svoj sport koristeći staviti() metoda:

ActivityMap.put (DayOfWeek.MONDAY, "Soccer");

A da ga dohvatimo, možemo koristiti dobiti():

assertThat (clubMap.get (DayOfWeek.MONDAY)). isEqualTo ("Soccer");

5. Provjera elemenata

Koristimo kako bismo provjerili imamo li definirano mapiranje za određeni dan containsKey ():

ActivityMap.put (DayOfWeek.srijeda, "Planinarenje"); assertThat (ActivityMap.containsKey (DayOfWeek.WEDNESDAY)). isTee ();

I, kako bismo provjerili je li određeni sport preslikan na bilo koji ključ koji koristimo sadržiVrijednost ():

assertThat (ActivityMap.containsValue ("Planinarenje")). isTee (); 

5.1. null kao Vrijednost

Sada, null je semantički valjana vrijednost za EnumMap.

Udružimo se null s "ne radeći ništa" i preslikajte je na subotu:

assertThat (ActivityMap.containsKey (DayOfWeek.SUBOTA)). isFalse (); assertThat (ActivityMap.containsValue (null)). isFalse (); ActivityMap.put (DayOfWeek.SUBOTA, null); assertThat (ActivityMap.containsKey (DayOfWeek.SUBOTA)). isTee (); assertThat (ActivityMap.containsValue (null)). isTrue ();

6. Uklanjanje elemenata

Da bismo mapirali određeni dan, mi jednostavno ukloniti() to:

ActivityMap.put (DayOfWeek.MONDAY, "Soccer"); assertThat (ActivityMap.remove (DayOfWeek.MONDAY)). isEqualTo ("Soccer"); assertThat (ActivityMap.containsKey (DayOfWeek.MONDAY)). isFalse (); 

Kao što možemo primijetiti, ukloni (ključ) vraća prethodnu vrijednost povezanu s ključem, ili null ako nije bilo mapiranja za ključ.

Možemo i odabrati raskrivanje određenog dana samo ako taj dan se preslikava na određenu aktivnost:

ActivityMap.put (DayOfWeek.Monday, "Soccer"); assertThat (ActivityMap.remove (DayOfWeek.Monday, "Planinarenje")). isEqualTo (false); assertThat (ActivityMap.remove (DayOfWeek.Monday, "Soccer")). isEqualTo (true); 

ukloni (ključ, vrijednost) uklanja unos za navedeni ključ samo ako je ključ trenutno mapiran na navedenu vrijednost.

7. Prikazi zbirke

Baš kao i kod običnih karata, i kod bilo kojih EnumMap, možemo imati 3 različita pogleda ili podzbirke.

Prvo, izradimo novu mapu naših aktivnosti:

EnumMap ActivityMap = novi EnumMap (DayOfWeek.class); ActivityMap.put (DayOfWeek.ČETVRTAK, "Karate"); ActivityMap.put (DayOfWeek.srijeda, "Planinarenje"); ActivityMap.put (DayOfWeek.MONDAY, "Soccer");

7.1. vrijednosti

Prvi pogled na našu mapu aktivnosti je vrijednosti () koja, kao što i samo ime govori, vraća sve vrijednosti na karti:

Vrijednosti zbirke = dayMap.values ​​(); assertThat (values) .containsExactly ("Soccer", "Hiking", "Karate"); 

Ovdje imajte na umu da EnumMap je uređena karta. Koristi redoslijed Dan u tjednu enum za određivanje redoslijeda unosa.

7.2. keySet

Slično tome, keySet () vraća kolekciju ključeva, opet prema nabrajanju:

Postavi tipke = dayMap.keySet (); assertThat (ključevi) .containEhactly (DayOfWeek.MONDAY, DayOfWeek.SREEDA, DayOfWeek.SUBOTA); 

7.3. entrySet

Posljednje, entrySet () vraća mapiranje u parovima ključa i vrijednosti:

assertThat (dayMap.entrySet ()) .containsExactly (novi SimpleEntry (DayOfWeek.MONDAY, "Soccer"), novi SimpleEntry (DayOfWeek. SRIJEDA, "Pješačenje"), novi SimpleEntry (DayOfWeek.THURSDAY, "Karate")); 

Naručivanje na karti zasigurno može dobro doći, a mi idemo dublje u naš vodič koji uspoređuje TreeMap s HashMapom.

7.4. Promjenjivost

Sad, imajte na umu da će se sve promjene koje napravimo na izvornoj mapi aktivnosti odraziti na bilo koji njezin pogled:

ActivityMap.put (DayOfWeek.UTORAK, "Košarka"); assertThat (values) .containsExactly ("Soccer", "Basketball", "Hiking", "Karate"); 

I obrnuto; sve promjene koje napravimo u pod-prikazima odrazit će se na izvornoj mapi aktivnosti:

values.remove ("Planinarenje"); assertThat (ActivityMap.containsKey (DayOfWeek.WEDNESDAY)). isFalse (); assertThat (ActivityMap.size ()). isEqualTo (3); 

Po EnumMap‘S ugovor s Karta sučelje, pod-prikazi podržani su izvornom mapom.

8. Kada koristiti EnumMap

8.1. Izvođenje

Koristeći Enum kao ključ omogućuje dodatnu optimizaciju izvedbe, poput bržeg izračuna heša jer su svi mogući ključevi unaprijed poznati.

Jednostavnost posjedovanja nabrajanje kao ključno sredstvo EnumMap treba ih podržati samo obična stara Java Polje s vrlo jednostavnom logikom za pohranu i pronalaženje. S druge strane, generički Karta implementacije trebaju riješiti zabrinutosti povezane s generičkim objektom kao ključem. Na primjer, HashMap treba složenu strukturu podataka i znatno složeniju logiku pohranjivanja i pronalaženja kako bi se zadovoljila mogućnost sudara hash-a.

8.2. Funkcionalnost

Također, kao što smo vidjeli, EnumMap je uređena karta u kojoj će se njezini pogledi ponavljati u nizu. Da bismo dobili slično ponašanje za složenije scenarije, možemo pogledati TreeMap ili LinkedHashMap.

9. Zaključak

U ovom smo članku istražili EnumMap provedba Karta sučelje. Pri radu s Enum kao ključ, EnumMap može dobro doći.

Potpuni izvorni kod za sve primjere korištene u ovom vodiču možete pronaći u projektu GitHub.