Útmutató az EnumMap-hoz
1. Áttekintés
EnumMap egy Térkép kizárólagosan megvalósításra van szükség Enum mint kulcsai.
Ebben az oktatóanyagban megvitatjuk a tulajdonságait, a szokásos használati eseteket és azt, hogy mikor kell használnunk.
2. Projekt beállítása
Képzeljen el egy egyszerű követelményt, ahol feltérképeznünk kell a hét napjait az aznapi sporttal:
Hétfő foci kedd kosárlabda szerda túrázás csütörtök karate
Ehhez használhatunk enumot:
public enum DayOfWeek {HÉTFŐ, KEDD, SZERDA, CSÜTÖRTÖK, PÉNTEK, SZOMBAT, VASÁRNAP}
Amit hamarosan meglátunk, az lesz a térképünk kulcsa.
3. Teremtés
Kezdeni a felfedezést EnumMap, először be kell állítanunk egyet:
EnumMap activityMap = új EnumMap (DayOfWeek.class); activityMap.put (DayOfWeek.MONDAY, "Foci");
És itt van az első különbség valami általánosabb dologban, például HashMap. Vegye figyelembe, hogy a HashMap, a típus paraméterezése elegendő, vagyis megúszhatjuk új HashMap (). Azonban, EnumMap megköveteli a kulcs típusát a konstruktorban.
3.1. EnumMap Copy Constructor
EnumMap két másolat-készítővel is szállít. Az első elvesz egy másikat EnumMap:
EnumMap activityMap = új EnumMap (DayOfWeek.class); activityMap.put (DayOfWeek.MONDAY, "Foci"); activityMap.put (DayOfWeek.TUESDAY, "Kosárlabda"); EnumMap activityMapCopy = új EnumMap (dayMap); assertThat (activityMapCopy.size ()). isEqualTo (2); assertThat (activityMapCopy.get (DayOfWeek.MONDAY)). isEqualTo ("Foci"); assertThat (activityMapCopy.get (DayOfWeek.TUESDAY)). isEqualTo ("Kosárlabda");
3.2. Térkép Copy Constructor
Vagy, ha van egy nem üres Térkép amelynek kulcsa egy enum, akkor mi is megtehetjük:
Térkép: normalMap = új HashMap (); rendesMap.put (DayOfWeek.MONDAY, "Foci"); EnumMap enumMap = új EnumMap (normalMap); assertThat (enumMap.size ()). isEqualTo (1); assertThat (enumMap.get (DayOfWeek.MONDAY)). isEqualTo ("Foci");
Vegye figyelembe, hogy a térképnek nem üresnek kell lennie EnumMap meg tudja határozni a kulcs típusát egy meglévő bejegyzésből.
Ha a megadott térkép egynél több enum típust tartalmaz, akkor a kivitelező dob ClassCastException.
4. Elemek hozzáadása és visszakeresése
Miután példányosított egy EnumMap, hozzáadhatjuk sportágunkat a put () módszer:
activityMap.put (DayOfWeek.MONDAY, "Foci");
És visszakereséséhez használhatjuk kap():
assertThat (clubMap.get (DayOfWeek.MONDAY)). isEqualTo ("Foci");
5. Az elemek ellenőrzése
Annak ellenőrzésére, hogy van-e meghatározva egy adott napra vonatkozó leképezés, használjuk tartalmazzaKey ():
activityMap.put (DayOfWeek.WEDNESDAY, "túrázás"); assertThat (activityMap.containsKey (DayOfWeek.WEDNESDAY)). isTrue ();
És annak ellenőrzése, hogy egy adott sportág fel van-e kapcsolva az általunk használt kulcsokkal tartalmazzaValue ():
assertThat (activityMap.containsValue ("túrázás")). isTrue ();
5.1. nulla mint Érték
Most, nulla szemantikailag érvényes értéke a EnumMap.
Társuljunk nulla „semmittevéssel”, és szombatig térképezzük fel:
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. Elemek eltávolítása
Egy adott nap feltérképezése érdekében egyszerűen eltávolítás () azt:
activityMap.put (DayOfWeek.MONDAY, "Foci"); assertThat (activityMap.remove (DayOfWeek.MONDAY)). isEqualTo ("Foci"); assertThat (activityMap.containsKey (DayOfWeek.MONDAY)). isFalse ();
Amint megfigyelhetjük, eltávolít (kulcs) a kulccsal társított előző értéket adja vissza, vagy nulla ha nem történt a kulcs leképezése.
Mi is választhatunk egy adott nap feltérképezése csak ha az a nap egy adott tevékenységhez van feltérképezve:
activityMap.put (DayOfWeek.Monday, "Foci"); assertThat (activityMap.remove (DayOfWeek.Monday, "túrázás")). isEqualTo (hamis); assertThat (activityMap.remove (DayOfWeek.Monday, "Foci")). isEqualTo (true);
eltávolítás (kulcs, érték) csak akkor távolítja el a megadott kulcs bejegyzését, ha a kulcs jelenleg a megadott értékhez van hozzárendelve.
7. Gyűjtemény nézetek
Csakúgy, mint a szokásos térképeknél, bármelyikkel EnumMap, 3 különböző nézetünk vagy algyűjteményünk lehet.
Először készítsünk egy új térképet tevékenységeinkről:
EnumMap activityMap = új EnumMap (DayOfWeek.class); activityMap.put (DayOfWeek.TÜRTÖRTÖK, "Karate"); activityMap.put (DayOfWeek.WEDNESDAY, "túrázás"); activityMap.put (DayOfWeek.MONDAY, "Foci");
7.1. értékek
Tevékenységi térképünk első nézete értékek () amely, amint a neve is mutatja, a térkép összes értékét visszaadja:
Gyűjtemény értékei = dayMap.values (); assertThat (értékek) .conactExactly ("foci", "túrázás", "karate");
Itt jegyezzük meg EnumMap egy rendezett térkép. A. Sorrendjét használja A hét napja enum a bejegyzések sorrendjének meghatározásához.
7.2. keySet
Hasonlóképpen, keySet () a kulcsok gyűjteményét adja vissza, ismét felsorolási sorrendben:
Set keys = dayMap.keySet (); assertThat (kulcsok) .containsExactly (DayOfWeek.MONDAY, DayOfWeek.WEDNESDAY, DayOfWeek.SATURDAY);
7.3. entrySet
Végül, entrySet () a kulcs és érték párjában adja vissza a leképezést:
assertThat (dayMap.entrySet ()) .conconExactly (új SimpleEntry (DayOfWeek.MONDAY, "Foci"), új SimpleEntry (DayOfWeek.WEDNESDAY, "Túrázás"), új SimpleEntry (DayOfWeek.THURSDAY), "Karate";
A térképen történő rendelés minden bizonnyal jól jöhet, és részletesebben bemutatjuk az oktatóanyagunkat, amely összehasonlítja a TreeMap-ot a HashMap-tal.
7.4. Változtathatóság
Ne feledje, hogy az eredeti tevékenységtérképen végrehajtott bármilyen változás tükröződik bármely nézetében:
activityMap.put (DayOfWeek.TUESDAY, "Kosárlabda"); assertThat (értékek). pontosan tartalmaz ("foci", "kosárlabda", "túrázás", "karate");
És fordítva; az alnézetekben végrehajtott bármilyen változás tükröződik az eredeti tevékenységtérképen:
értékek.remove ("túrázás"); assertThat (activityMap.containsKey (DayOfWeek.WEDNESDAY)). isFalse (); assertThat (activityMap.size ()). isEqualTo (3);
Per EnumMapSzerződése Térkép felületen az alnézeteket az eredeti térkép támogatja.
8. Mikor kell használni EnumMap
8.1. Teljesítmény
Használata Enum mivel a kulcs lehetővé teszi néhány extra teljesítmény-optimalizálást, mint egy gyorsabb hash-számítás, mivel az összes lehetséges kulcs előre ismert.
A birtoklás egyszerűsége enum mint kulcsfontosságú EnumMap csak egy sima régi Java-val kell alátámasztani Sor a tárolás és visszakeresés nagyon egyszerű logikájával. Másrészt általános Térkép a megvalósításoknak figyelembe kell venniük azokat az aggályokat, amelyek egy általános objektum kulcsa. Például, HashMap komplex adatstruktúrára és lényegesen összetettebb tárolási és visszakeresési logikára van szüksége a hash ütközés lehetőségének kielégítéséhez.
8.2. Funkcionalitás
Továbbá, amint láttuk, EnumMap rendezett térkép, annyiban, hogy nézetei sorrendben ismétlődnek. A bonyolultabb forgatókönyvek esetén hasonló viselkedést kaphatunk TreeMap vagy LinkedHashMap.
9. Következtetés
Ebben a cikkben a EnumMap a Térkép felület. Amikor dolgozik Enum mint kulcs, EnumMap jól jöhet.
Az oktatóanyagban használt összes példa teljes forráskódja megtalálható a GitHub projektben.