En guide til EnumMap

1. Oversikt

EnumMap er en Kart implementering som utelukkende tar Enum som nøklene.

I denne veiledningen vil vi diskutere egenskapene, vanlige brukssaker og når vi skal bruke den.

2. Prosjektoppsett

Tenk deg et enkelt krav der vi trenger å kartlegge ukedagene med sporten vi spiller den dagen:

Mandag Fotball Tirsdag Basketball Onsdag Vandring Torsdag Karate 

For dette kan vi bruke enum:

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

Som vi snart vil se, vil være nøkkelen til kartet vårt.

3. Skapelse

Å begynne å utforske EnumMapførst må vi starte en:

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

Og her er vår første forskjell på noe mer vanlig, som HashMap. Legg merke til at med HashMap, er typeparameterisering tilstrekkelig, noe som betyr at vi kan komme unna ny HashMap (). Derimot, EnumMap krever nøkkeltypen i konstruktøren.

3.1. EnumMap Copy Constructor

EnumMap leveres også med to kopikonstruktører. Den første tar en til EnumMap:

EnumMap activityMap = ny EnumMap (DayOfWeek.class); activityMap.put (DayOfWeek.MONDAY, "Soccer"); activityMap.put (DayOfWeek.TUESDAY, "Basketball"); EnumMap activityMapCopy = ny EnumMap (dayMap); assertThat (activityMapCopy.size ()). erEqualTo (2); assertThat (activityMapCopy.get (DayOfWeek.MONDAY)). isEqualTo ("Soccer"); assertThat (activityMapCopy.get (DayOfWeek.TUESDAY)). isEqualTo ("Basketball");

3.2. Kart Copy Constructor

Eller, hvis vi har en ikke-tom Kart hvis nøkkel er en enum, så kan vi også gjøre det:

Kartlegg ordinært kart = nytt HashMap (); normalMap.put (DayOfWeek.MONDAY, "Soccer"); EnumMap enumMap = ny EnumMap (ordinær kart); assertThat (enumMap.size ()). er EqualTo (1); assertThat (enumMap.get (DayOfWeek.MONDAY)). erEqualTo ("Soccer");

Merk at kartet må være ikke-tomt slik at EnumMap kan bestemme nøkkeltypen fra en eksisterende oppføring.

Hvis det angitte kartet inneholder mer enn en enumtype, vil konstruktøren kaste ClassCastException.

4. Legge til og hente elementer

Etter å ha startet en EnumMap, kan vi legge til sporten vår ved hjelp av sette() metode:

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

Og for å hente det, kan vi bruke få():

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

5. Kontrollere om det er elementer

For å sjekke om vi har definert en kartlegging for en bestemt dag, bruker vi inneholderKey ():

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

Og for å sjekke om en bestemt sport er kartlagt til en hvilken som helst nøkkel vi bruker inneholder verdi ():

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

5.1. null som verdi

Nå, null er en semantisk gyldig verdi for EnumMap.

La oss assosiere null med å "gjøre ingenting", og kartlegg 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. Fjerne elementer

For å kartlegge en bestemt dag, bare fjerne() den:

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

Som vi kan se, fjerne (nøkkel) returnerer den forrige verdien som er knyttet til nøkkelen, eller null hvis det ikke var noen kartlegging for nøkkelen.

Vi kan også velge å kartlegge en bestemt dag bare hvis den dagen er kartlagt til en bestemt aktivitet:

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

fjerne (nøkkel, verdi) fjerner bare oppføringen for den angitte nøkkelen hvis nøkkelen for øyeblikket er tilordnet den angitte verdien.

7. Samlingsvisninger

Akkurat som med vanlige kart, med noen EnumMap, kan vi ha 3 forskjellige visninger eller undersamlinger.

La oss først lage et nytt kart over aktivitetene våre:

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

7.1. verdier

Den første visningen av aktivitetskartet vårt er verdier () som, som navnet antyder, returnerer alle verdiene på kartet:

Samlingsverdier = dayMap.values ​​(); assertThat (verdier) .containsExactly ("Fotball", "Vandring", "Karate"); 

Merk her at EnumMap er et bestilt kart. Den bruker rekkefølgen på Ukedag enum for å bestemme rekkefølgen på oppføringene.

7.2. keySet

På samme måte, keySet () returnerer en samling nøklene, igjen i enum rekkefølge:

Sett nøkler = dayMap.keySet (); assertThat (nøkler) .containsExactly (DayOfWeek.MONDAY, DayOfWeek.WEDNESDAY, DayOfWeek.SATURDAY); 

7.3. entrySet

Til slutt, entrySet () returnerer kartleggingen i par med nøkkel og verdi:

assertThat (dayMap.entrySet ()) .containsExactly (new SimpleEntry (DayOfWeek.MONDAY, "Soccer"), new SimpleEntry (DayOfWeek.WEDNESDAY, "Hiking"), new SimpleEntry (DayOfWeek.THURSDAY, "Karate")); 

Bestilling på et kart kan absolutt være nyttig, og vi går mer i dybden i vår opplæring som sammenligner TreeMap med HashMap.

7.4. Mutabilitet

Husk nå at eventuelle endringer vi gjør i det opprinnelige aktivitetskartet, vil gjenspeiles i noen av synspunktene:

activityMap.put (DayOfWeek.TUESDAY, "Basketball"); assertThat (verdier) .containsExactly ("Fotball", "Basketball", "Vandring", "Karate"); 

Og vice versa; eventuelle endringer vi gjør undervisningene gjenspeiles i det opprinnelige aktivitetskartet:

values.remove ("Vandring"); assertThat (activityMap.containsKey (DayOfWeek.WEDNESDAY)). isFalse (); assertThat (activityMap.size ()). erEqualTo (3); 

Per EnumMap’S kontrakt med Kart grensesnitt, er undervisningene støttet av det originale kartet.

8. Når skal du bruke den? EnumMap

8.1. Opptreden

Ved hjelp av Enum som nøkkel gjør det mulig å gjøre litt ekstra ytelsesoptimalisering, som en raskere hashberegning siden alle mulige nøkler er kjent på forhånd.

Enkelheten i å ha enum som nøkkel betyr EnumMap trenger bare å bli sikkerhetskopiert av en vanlig gammel Java Array med veldig enkel logikk for lagring og henting. På den annen side generisk Kart implementeringer må imøtekomme bekymringer knyttet til å ha et generisk objekt som nøkkelen. For eksempel, HashMap trenger en kompleks datastruktur og en betydelig mer kompleks lagrings- og hentelogikk for å imøtekomme muligheten for hasjkollisjon.

8.2. Funksjonalitet

Som vi så, EnumMap er et ordnet kart, ved at synspunktene vil gjentas i enum orden. For å få lignende oppførsel for mer komplekse scenarier, kan vi se på TreeMap eller LinkedHashMap.

9. Konklusjon

I denne artikkelen har vi utforsket EnumMap gjennomføring av Kart grensesnitt. Når du jobber med Enum som en nøkkel, EnumMap kan komme godt med.

Den fullstendige kildekoden for alle eksemplene som brukes i denne opplæringen, finner du i GitHub-prosjektet.


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