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.