A primitívek térképe a Java-ban
1. Áttekintés
Ebben az oktatóanyagban megtanuljuk hogyan lehet térképet felépíteni primitív kulcsokkal és értékekkel.
Mint tudjuk, az alapvető Java Térképs nem engedélyezik a primitív kulcsok vagy értékek tárolását. Ezért bemutatunk néhány külső, harmadik féltől származó könyvtárat, amelyek primitív térképi megvalósításokat biztosítanak.
2. Eclipse gyűjtemények
Az Eclipse Collections egy nagy teljesítményű gyűjteményi keretrendszer a Java számára. Javított megvalósításokat, valamint néhány további adatstruktúrát biztosít, beleértve a több primitív gyűjtemény.
2.1. Változtatható és megváltoztathatatlan Térképek
Hozzunk létre egy üres térképet, ahol a kulcsok és az értékek egyaránt primitívek ints. Ehhez a IntIntMaps gyári osztály:
MutableIntIntMap mutableIntIntMap = IntIntMaps.mutable.empty ();
A IntIntMaps a gyári osztály a legkényelmesebb módszer a primitív térképek létrehozására. Ez lehetővé teszi számunkra, hogy a kívánt típusú térképből mutatható és változhatatlan példányokat is létrehozzunk. Példánkban létrehoztuk a IntIntMap. Hasonlóképpen létrehozhatunk egy megváltoztathatatlan példányt is, ha egyszerűen kicseréljük a IntIntMaps.mutable statikus gyári hívás IntIntMaps.muutathatatlan:
ImmutableIntIntMap immutableIntIntMap = IntIntMaps.immutable.empty ();
Tehát adjunk hozzá egy kulcs, érték párot a változtatható térképünkhöz:
mutableIntIntMap.addToValue (1, 1);
Hasonlóképpen, vegyes térképeket készíthetünk referencia és primitív típusú kulcs-érték párokkal. Hozzunk létre egy térképet a Húr gombok és kettős értékek:
MutableObjectDoubleMap dObject = ObjectDoubleMaps.mutable.empty ();
Itt használtuk a ObjectDoubleMaps gyári osztály, amelyhez létrehozható egy módosítható példány MutableObjectDoubleMap.
Most adjunk hozzá néhány bejegyzést:
dObject.addToValue ("ár", 150,5); dObject.addToValue ("minőség", 4.4); dObject.addToValue ("stabilitás", 0,8);
2.2. Egy primitív API-fa
Az Eclipse gyűjteményekben van egy alap interfész PrimitiveIterable. Ez az alap interfész a könyvtár minden primitív tartályához. Mindegyik meg van nevezve PrimitiveTypeIterable, hol PrimitiveType lehet Int, Hosszú, Rövid, Byte, Char, Úszó, Kettős, vagy Logikai.
Mindezeknek az alapfelületeknek viszont van a fája XYTérkép megvalósítások, ami megoszlik abban, hogy a térkép változtatható vagy megváltoztathatatlan. Például a IntIntMap, nekünk van MutableIntIntMap és ImmutableIntIntMap.
Végül, amint fentebb láttuk, meg is tettük interfészek, amelyek lefedik a kulcsok és értékek mindenféle kombinációját a primitív és az objektum értékeknél egyaránt. Így például megkaphatjuk IntObjectMap egy primitív kulcshoz egy Tárgy érték vagy ObjectIntMap ellentétes esetére.
3. HPPC
A HPPC a nagy teljesítményre és a memória hatékonyságára irányuló könyvtár. Ez azt jelenti, hogy a könyvtár kevesebb absztrakcióval rendelkezik, mint mások. Ennek azonban az az előnye, hogy a belsejét hasznos, alacsony szintű manipulációnak teszi ki. Térképeket és készleteket egyaránt kínál.
3.1. Egyszerű példa
Kezdjük egy olyan térkép létrehozásával, amelynek van int kulcs és a hosszú érték. Ennek használata nagyon ismerős:
IntLongHashMap intLongHashMap = új IntLongHashMap (); intLongHashMap.put (25, 1 L); intLongHashMap.put (150, Long.MAX_VALUE); intLongHashMap.put (1, 0L); intLongHashMap.get (150);
A HPPC térképeket biztosít a kulcsok és értékek minden kombinációjához:
- Primitív kulcs és primitív érték
- Primitív kulcs és objektumtípus-érték
- Objektumtípus-kulcs és primitív érték
- Mind az Object-type kulcs, mind az érték
Az objektumtípusú térképek támogatják az általános információkat:
IntObjectOpenHashMap ObjectIntOpenHashMap
Az első térkép primitív int kulcs és a BigDecimal érték. A második térkép rendelkezik LocalDate kulcsaiért és int értékeiért
3.2. Hash Maps vs Scatter Maps
A kulcsok kivonatolásának és terjesztési funkcióinak hagyományos megvalósítási módja miatt ütközésbe kerülhetünk a kulcsok kivonásakor. A kulcsok elosztásától függően ez hatalmas térképeken teljesítményproblémákhoz vezethet. Alapértelmezés szerint a HPPC olyan megoldást valósít meg, amely elkerüli ezt a problémát.
Azonban még mindig van hely az egyszerűbb terjesztési funkcióval rendelkező térképek számára. Ez hasznos ha a térképeket keresési táblákként vagy számlálásra használják, vagy ha a betöltés után nem igényelnek sok írási műveletet. A HHPC biztosítja Scatter Maps hogy még jobban növelje a teljesítményt.
Az összes scatter-map osztály ugyanazt az elnevezési szokást tartja fenn, mint a térkép, de ehelyett a szót használja Szétszór:
- IntScatterSet
- IntIntScatterMap
- IntObjectScatterMap
4. Fastutil
A Fastutil gyors és kompakt váz amely típus-specifikus gyűjteményeket tartalmaz, beleértve primitív típusú térképeket is.
4.1. Gyors példa
Hasonló az Eclipse gyűjteményekhez és a HPPC-hez. A Fastutil primitív-primitív és primitív-objektum típusú tipikus asszociációs térképeket is biztosít.
Hozzunk létre egy int nak nek logikai térkép:
Int2BooleanMap int2BooleanMap = új Int2BooleanOpenHashMap ();
És most tegyünk fel néhány bejegyzést:
int2BooleanMap.put (1, igaz); int2BooleanMap.put (7, hamis); int2BooleanMap.put (4, igaz);
Ezután lekérhetünk belőle értékeket:
logikai érték = int2BooleanMap.get (1);
4.2. Helyi iteráció
A JVM szabványos gyűjteményei, amelyek megvalósítják a Iterálható Az interfész általában minden iterációs lépésnél létrehoz egy új ideiglenes iterátor objektumot. Hatalmas gyűjtésekkel ez szemétgyűjtési problémát okozhat.
A Fastutil egy alternatívát kínál, amely ezt jelentősen enyhíti:
Int2FloatMap map = új Int2FloatMap (); // Adjon hozzá kulcsokat ide az (Int2FloatMap.Entry e: Fastutil.fastIterable (map)) {// e fájlhoz minden egyes iterációnál újrafelhasználásra kerül, tehát csak egy objektum lesz}
A Fastutil biztosítja a fastForeach módszer. Ehhez a Fogyasztó funkcionális interfészt, és végezzen lambda-kifejezést minden hurokhoz:
Int2FloatMap map = új Int2FloatMap (); // Adjon hozzá kulcsokat ide Int2FloatMaps.fastForEach (map, e -> {// e is újra felhasználásra kerül az iterációk között});
Ez nagyon hasonlít a szokásos Java-ra az egyes konstrukció:
Int2FloatMap map = új Int2FloatMap (); // Adjon hozzá kulcsokat ide map.forEach ((kulcs, érték) -> {// minden kulcsot / értéket használjon});
5. Következtetés
Ebben a cikkben megtanultuk, hogyan kell hozzon létre primitív térképeket a Java-ban az Eclipse Collections, a HPPC és a Fastutil segítségével.
Mint mindig, a cikk példakódja elérhető a GitHubon.