En guide til EnumMap

1. Oversigt

EnumMap er en Kort implementering, der udelukkende tager Enum som dens nøgler.

I denne vejledning diskuterer vi dens egenskaber, almindelige brugssager, og hvornår vi skal bruge det.

2. Opsætning af projekt

Forestil dig et simpelt krav, hvor vi har brug for at kortlægge ugedage med den sport, vi spiller den dag:

Mandag Fodbold Tirsdag Basketball Onsdag Vandring Torsdag Karate 

Til dette kunne vi bruge en enum:

offentlig enum DayOfWeek {MANDAG, TIRSDAY, ONDESDAY, THURSDAY, FRIDAY, LATURDAY, SUNDAY}

Som vi snart vil se, vil være nøglen til vores kort.

3. Skabelse

At begynde at udforske EnumMapførst skal vi instantiere en:

EnumMap activityMap = ny EnumMap (DayOfWeek.class); activityMap.put (DayOfWeek.MONDAY, "Fodbold"); 

Og her er vores første forskel på noget mere almindeligt, som HashMap. Bemærk, at med HashMap, er typeparameterisering tilstrækkelig, hvilket betyder, at vi kan komme væk med nyt HashMap (). Imidlertid, EnumMap kræver nøgletypen i konstruktøren.

3.1. EnumMap Copy Constructor

EnumMap leveres også med to kopikonstruktører. Den første tager en anden EnumMap:

EnumMap activityMap = ny EnumMap (DayOfWeek.class); activityMap.put (DayOfWeek.MONDAY, "Fodbold"); activityMap.put (DayOfWeek.TUESDAY, "Basketball"); EnumMap activityMapCopy = ny EnumMap (dayMap); hævder, at (activityMapCopy.size ()). er lig med (2); assertThat (activityMapCopy.get (DayOfWeek.MONDAY)). erEqualTo ("Fodbold"); assertThat (activityMapCopy.get (DayOfWeek.TUESDAY)). isEqualTo ("Basketball");

3.2. Kort Copy Constructor

Eller, hvis vi har en ikke-tom Kort hvis nøgle er en enum, så kan vi også gøre det:

Kort normalMap = nyt HashMap (); normalMap.put (DayOfWeek.MONDAY, "Fodbold"); EnumMap enumMap = ny EnumMap (almindelig Kort); hævder, at (enumMap.size ()). er lig med (1); assertThat (enumMap.get (DayOfWeek.MONDAY)). erEqualTo ("Fodbold");

Bemærk, at kortet skal være tomt, så det EnumMap kan bestemme nøgletypen ud fra en eksisterende post.

Hvis det angivne kort indeholder mere end en enumtype, kaster konstruktøren ClassCastException.

4. Tilføjelse og hentning af elementer

Efter at have startet en EnumMap, kan vi tilføje vores sport ved hjælp af sætte() metode:

activityMap.put (DayOfWeek.MONDAY, "Fodbold");

Og for at hente det kan vi bruge få():

assertThat (clubMap.get (DayOfWeek.MONDAY)). erEqualTo ("Fodbold");

5. Kontrol af elementer

For at kontrollere, om vi har defineret en kortlægning for en bestemt dag, bruger vi indeholderKey ():

activityMap.put (DayOfWeek.WEDNESDAY, "Vandring"); assertThat (activityMap.containsKey (DayOfWeek.WEDNESDAY)). isTrue ();

Og for at kontrollere, om en bestemt sport er kortlagt til en hvilken som helst nøgle, vi bruger indeholder værdi ():

assertThat (activityMap.containsValue ("Vandring")). isTrue (); 

5.1. nul som værdi

Nu, nul er en semantisk gyldig værdi for EnumMap.

Lad os forbinde nul med "gør ingenting", og kortlæg det til lørdag:

assertThat (activityMap.containsKey (DayOfWeek.SATURDAY)). isFalse (); assertThat (activityMap.containsValue (null)). isFalse (); activityMap.put (DayOfWeek.SATURDAY, null); assertThat (activityMap.containsKey (DayOfWeek.SATURDAY)). isTrue (); assertThat (activityMap.containsValue (null)). isTrue ();

6. Fjernelse af elementer

For at kortlægge en bestemt dag, vi simpelthen fjerne() det:

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

Som vi kan se, fjern (nøgle) returnerer den tidligere værdi, der er knyttet til nøglen, eller nul hvis der ikke var nogen kortlægning af nøglen.

Vi kan også vælge at unmap en bestemt dag kun hvis den dag er kortlagt til en bestemt aktivitet:

activityMap.put (DayOfWeek.Monday, "Fodbold"); assertThat (activityMap.remove (DayOfWeek. mandag, "Vandring")). er EqualTo (false); assertThat (activityMap.remove (DayOfWeek. mandag, "Fodbold")). isEqualTo (true); 

fjern (nøgle, værdi) fjerner kun posten for den angivne nøgle, hvis nøglen i øjeblikket er tilknyttet den angivne værdi.

7. Samlingsudsigter

Ligesom med almindelige kort med alle EnumMap, kan vi have 3 forskellige visninger eller undersamlinger.

Lad os først oprette et nyt kort over vores aktiviteter:

EnumMap activityMap = ny EnumMap (DayOfWeek.class); activityMap.put (DayOfWeek.THURSDAY, "Karate"); activityMap.put (DayOfWeek.WEDNESDAY, "Vandring"); activityMap.put (DayOfWeek.MONDAY, "Fodbold");

7.1. værdier

Den første visning af vores aktivitetskort er værdier () som, som navnet antyder, returnerer alle værdierne på kortet:

Samlingsværdier = dayMap.values ​​(); assertThat (værdier) .containsExactly ("Fodbold", "Vandring", "Karate"); 

Bemærk her, at EnumMap er et ordnet kort. Det bruger rækkefølgen af DayOfWeek for at bestemme rækkefølgen af ​​posterne.

7.2. keySet

Tilsvarende keySet () returnerer en samling nøgler, igen i enum rækkefølge:

Indstil taster = dayMap.keySet (); assertThat (nøgler) .containsExactly (DayOfWeek.MONDAY, DayOfWeek.WEDNESDAY, DayOfWeek.SATURDAY); 

7.3. entrySet

Endelig entrySet () returnerer kortlægningen i par af nøgle og værdi:

assertThat (dayMap.entrySet ()) .containsExactly (ny SimpleEntry (DayOfWeek. MANDAG, "Fodbold"), ny SimpleEntry (DayOfWeek.WEDNESDAY, "Vandring"), ny SimpleEntry (DayOfWeek.THURSDAY, "Karate")); 

Bestilling på et kort kan helt sikkert komme til nytte, og vi går nærmere ind i vores vejledning, der sammenligner TreeMap med HashMap.

7.4. Ændring

Husk nu, at eventuelle ændringer, vi foretager i det oprindelige aktivitetskort, afspejles i nogen af ​​dens synspunkter:

activityMap.put (DayOfWeek.TUESDAY, "Basketball"); assertThat (værdier) .containsExactly ("Fodbold", "Basketball", "Vandring", "Karate"); 

Og omvendt; eventuelle ændringer, vi foretager undervisningerne, afspejles i det originale aktivitetskort:

values.remove ("Vandring"); assertThat (activityMap.containsKey (DayOfWeek.WEDNESDAY)). isFalse (); hævder, at (activityMap.size ()). er lig med (3); 

Om EnumMap'S kontrakt med Kort interface, understøttes undervisningerne af det originale kort.

8. Hvornår skal du bruge det? EnumMap

8.1. Ydeevne

Ved brug af Enum som nøgle gør det muligt at foretage ekstra ydeevneoptimering, som en hurtigere hashberegning, da alle mulige nøgler er kendt på forhånd.

Enkelheden ved at have enum som nøgle betyder EnumMap behøver kun at blive bakket op af en almindelig gammel Java Array med meget enkel logik til opbevaring og hentning. På den anden side generisk Kort implementeringer skal tage højde for bekymringer relateret til at have et generisk objekt som nøgle. For eksempel, HashMap har brug for en kompleks datastruktur og en betydeligt mere kompleks lagring og hentningslogik for at imødekomme muligheden for hash-kollision.

8.2. Funktionalitet

Som vi så, EnumMap er et ordnet kort, idet dets synspunkter gentages i enum rækkefølge. For at få lignende adfærd for mere komplekse scenarier kan vi se på TreeMap eller LinkedHashMap.

9. Konklusion

I denne artikel har vi udforsket EnumMap gennemførelse af Kort interface. Når du arbejder med Enum som en nøgle, EnumMap kan komme godt med.

Den fulde kildekode til alle eksemplerne i denne vejledning kan findes i GitHub-projektet.


$config[zx-auto] not found$config[zx-overlay] not found