Mapa primitívov v Jave

1. Prehľad

V tejto príručke sa naučíme ako zostaviť mapu s primitívnymi kľúčmi a hodnotami.

Ako vieme, základné Java Mapas neumožňujú ukladanie primitívnych kľúčov alebo hodnôt. Preto predstavíme niektoré externé knižnice tretích strán, ktoré poskytujú primitívne implementácie máp.

2. Zbierky zatmenia

Kolekcie Eclipse sú vysoko výkonným rámcom pre kolekciu Java. Poskytuje vylepšené implementácie a niektoré ďalšie dátové štruktúry vrátane niekoľko primitívnych zbierok.

2.1. Premenlivé a nemenné Mapy

Vytvorme prázdnu mapu, kde kľúče aj hodnoty sú primitívne ints. Na to použijeme IntIntMaps továrenská trieda:

MutableIntIntMap mutableIntIntMap = IntIntMaps.mutable.empty ();

The IntIntMaps továrenská trieda je najpohodlnejší spôsob vytvárania primitívnych máp. Umožňuje nám vytvárať premenlivé aj nemenné inštancie požadovaného typu mapy. V našom príklade sme vytvorili premenlivú inštanciu IntIntMap. Podobne môžeme vytvoriť nemennú inštanciu jednoduchou výmenou IntIntMaps.mutable statické továrenské volanie s IntIntMaps.nemeniteľné:

ImmutableIntIntMap immutableIntIntMap = IntIntMaps.immutable.empty ();

Poďme teda do našej premenlivej mapy pridať pár kľúč - hodnota:

mutableIntIntMap.addToValue (1, 1);

Podobne, môžeme vytvoriť zmiešané mapy s pármi kľúč - hodnota referenčného a primitívneho typu. Vytvorme mapu pomocou String kľúče a dvojitý hodnoty:

MutableObjectDoubleMap dObject = ObjectDoubleMaps.mutable.empty ();

Tu sme použili ObjectDoubleMaps továrenská trieda na vytvorenie premenlivej inštancie pre MutableObjectDoubleMap.

Teraz pridajme niekoľko záznamov:

dObject.addToValue ("cena", 150,5); dObject.addToValue ("kvalita", 4,4); dObject.addToValue ("stabilita", 0,8);

2.2. Primitívny strom API

V zbierkach Eclipse existuje základné rozhranie s názvom PrimitívneZmeniteľné. Toto je základné rozhranie pre každý z primitívnych kontajnerov knižnice. Všetci sú menovaní PrimitiveTypeIterable, kde PrimitiveType môže byť Int, Long, Krátky, Byte, Char, Plavák, Dvojitýalebo Boolovský.

Všetky tieto základné rozhrania majú zase svoj strom XYMapa implementácie, čo je rozdelené na to, či je mapa zmeniteľná alebo nemenná. Ako príklad pre IntIntMap, máme MutableIntIntMap a ImmutableIntIntMap.

Nakoniec, ako sme videli vyššie, máme rozhrania na pokrytie všetkých druhov kombinácií typov pre kľúče a hodnôt pre primitívne aj objektové hodnoty. Takže napríklad môžeme mať IntObjectMap pre primitívny kľúč s Objekt hodnota resp ObjectIntMap pre jeho opačný prípad.

3. HPPC

HPPC je knižnica zameraná na vysoký výkon a efektivitu pamäte. To znamená, že knižnica má menšiu abstrakciu ako iné. To však má výhodu v tom, že vnútorná strana je vystavená užitočnej manipulácii na nízkej úrovni. Poskytuje mapy aj súpravy.

3.1. Jednoduchý príklad

Začnime vytvorením mapy, ktorá má int kľúč a a dlho hodnotu. Používanie tohto nástroja je celkom dobre známe:

IntLongHashMap intLongHashMap = nový IntLongHashMap (); intLongHashMap.put (25, 1L); intLongHashMap.put (150, Long.MAX_VALUE); intLongHashMap.put (1, 0L); intLongHashMap.get (150);

HPPC poskytuje mapy pre všetky kombinácie kľúčov a hodnôt:

  • Primitívny kľúč a primitívna hodnota
  • Primitívny kľúč a hodnota typu objektu
  • Kľúč typu objektu a primitívna hodnota
  • Kľúč aj hodnota typu Objekt

Generické mapy máp:

IntObjectOpenHashMap ObjectIntOpenHashMap 

Prvá mapa má primitív int kľúč a a BigDecimal hodnotu. Druhá mapa má LocalDate pre jeho kľúče a int pre jeho hodnoty

3.2. Hash Maps vs Scatter Maps

Kvôli spôsobu, akým sa tradične implementujú funkcie hašovania a distribúcie kľúčov, by pri hašovaní kľúčov mohlo dôjsť ku kolízii. V závislosti od toho, ako sú kľúče distribuované, to môže viesť k problémom s výkonom na obrovských mapách. V predvolenom nastavení implementuje HPPC riešenie, ktoré sa vyhýba tomuto problému.

Stále však existuje miesto pre mapy, ktoré majú jednoduchšiu distribučnú funkciu. To je užitočné ak sa mapy používajú ako vyhľadávacie tabuľky alebo na počítanie, alebo ak po načítaní nevyžadujú veľa operácií zápisu. HHPC poskytuje Bodové mapy ešte viac zvýšiť výkon.

Všetky triedy scatter-map zachovávajú rovnaké pomenovacie konvencie ako mapy, namiesto toho však používajú slovo Rozptyl:

  • IntScatterSet
  • IntIntScatterMap
  • IntObjectScatterMap

4. Fastutil

Fastutil je rýchly a kompaktný rámec ktorá poskytuje typovo špecifické zbierky vrátane máp primitívneho typu.

4.1. Rýchly príklad

Podobne ako Eclipse Collections a HPPC. Fastutil tiež poskytuje asociačné mapy typizované na primitívne a primitívne na objekt.

Vytvorme int do boolovský mapa:

Int2BooleanMap int2BooleanMap = nový Int2BooleanOpenHashMap ();

A teraz pridajme niekoľko záznamov:

int2BooleanMap.put (1, true); int2BooleanMap.put (7, nepravda); int2BooleanMap.put (4, true);

Potom z neho môžeme načítať hodnoty:

boolovská hodnota = int2BooleanMap.get (1);

4.2. Iterácia na mieste

Štandardné kolekcie JVM, ktoré implementujú Iterable rozhranie zvyčajne vytvorí nový dočasný iteračný objekt v každom iteračnom kroku. Vďaka obrovským zbierkam to môže spôsobiť problém so zberom odpadu.

Fastutil poskytuje alternatívu, ktorá to výrazne zmierňuje:

Mapa Int2FloatMap = nová Int2FloatMap (); // Sem pridajte kľúče pre (Int2FloatMap.Entry e: Fastutil.fastIterable (mapa)) {// e sa bude opakovane používať pri každej iterácii, takže to bude iba jeden objekt} 

Fastutil tiež poskytuje fastForeach metóda. Toto bude trvať a Spotrebiteľ funkčné rozhranie a pre každú slučku vykonajte výraz lambda:

Mapa Int2FloatMap = nová Int2FloatMap (); // Sem pridaj klúče Int2FloatMaps.fastForEach (mapa, e -> {// e sa tiež opakovane používa vo všetkých iteráciách}); 

Toto je veľmi podobné štandardnej Jave pre každý konštruovať:

Mapa Int2FloatMap = nová Int2FloatMap (); // Sem pridajte kľúče map.forEach ((kľúč, hodnota) -> {// použite každý vstup kľúča / hodnoty}); 

5. Záver

V tomto článku sme sa dozvedeli, ako na to vytvárať primitívne mapy v Jave pomocou Eclipse Collections, HPPC a Fastutil.

Vzorový kód tohto článku je ako vždy k dispozícii na stránkach GitHub.


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