Kart over primitiver i Java

1. Oversikt

I denne opplæringen lærer vi hvordan lage et kart med primitive nøkler og verdier.

Som vi vet, kjernen Java Karts tillater ikke lagring av primitive nøkler eller verdier. Derfor introduserer vi noen eksterne tredjepartsbiblioteker som tilbyr primitive kartimplementeringer.

2. Formørkelsamlinger

Eclipse Collections er et høyytelsessamlingsrammeverk for Java. Det gir forbedrede implementeringer, samt noen ekstra datastrukturer, inkludert flere primitive samlinger.

2.1. Muterbar og uforanderlig Kart

La oss lage et tomt kart der både nøkler og verdier er primitive ints. For det bruker vi IntIntMaps fabrikk klasse:

MutableIntIntMap mutableIntIntMap = IntIntMaps.mutable.empty ();

De IntIntMaps fabrikklasse er den mest praktiske måten å lage primitive kart på. Det lar oss lage både foranderlige og uforanderlige forekomster av ønsket karttype. I vårt eksempel opprettet vi den foranderlige forekomsten av IntIntMap. På samme måte kan vi lage en uforanderlig forekomst ved ganske enkelt å erstatte IntIntMaps.mutable statisk fabrikksamtale med IntIntMaps.immutable:

ImmutableIntIntMap immutableIntIntMap = IntIntMaps.immutable.empty ();

Så la oss legge til et nøkkel-, verdipar på det foranderlige kartet vårt:

mutableIntIntMap.addToValue (1, 1);

Like måte, vi kan lage blandede kart med referanse- og primitive type nøkkelverdipar. La oss lage et kart med String nøkler og dobbelt verdier:

MutableObjectDoubleMap dObject = ObjectDoubleMaps.mutable.empty ();

Her brukte vi ObjectDoubleMaps fabrikklasse for å opprette en foranderlig forekomst for MutableObjectDoubleMap.

La oss nå legge til noen oppføringer:

dObject.addToValue ("pris", 150,5); dObject.addToValue ("kvalitet", 4.4); dObject.addToValue ("stabilitet", 0,8);

2.2. Et primitivt API-tre

I Eclipse Collections er det et grensesnitt som heter PrimitivIterabel. Dette er basisgrensesnittet for hver av de primitive beholderne i biblioteket. Alle er navngitt PrimitiveTypeIterable, hvor Primitive Type kan være Int, lang, Kort, Byte, Char, Flyte, Dobbelt, eller Boolsk.

Alle disse basegrensesnittene har igjen sitt tre XYKart implementeringer, som er delt på om kartet er foranderlig eller uforanderlig. Som et eksempel, for IntIntMap, vi har MutableIntIntMap og ImmutableIntIntMap.

Til slutt, som vi så ovenfor, har vi gjort det grensesnitt for å dekke alle slags kombinasjoner av typer for nøkler og verdier for både primitive og objektverdier. Så for eksempel kan vi ha IntObjectMap for en primitiv nøkkel med en Gjenstand verdi eller ObjectIntMap for sin motsatte sak.

3. HPPC

HPPC er et bibliotek rettet mot høy ytelse og minneeffektivitet. Dette betyr at biblioteket har mindre abstraksjon enn andre. Dette har imidlertid fordelen av å utsette internene for nyttig manipulering på lavt nivå. Den gir både kart og sett.

3.1. Et enkelt eksempel

La oss starte med å lage et kart som har et int nøkkel og en lang verdi. Å bruke dette er ganske kjent:

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

HPPC tilbyr kart for alle kombinasjoner av nøkler og verdier:

  • Primitiv nøkkel og primitiv verdi
  • Primitiv nøkkel og objekttype-verdi
  • Objekt-type nøkkel og primitiv verdi
  • Både Objekt-type nøkkel og verdi

Objekt-type kart støtter generikk:

IntObjectOpenHashMap ObjectIntOpenHashMap 

Det første kartet har et primitivt int nøkkel og en BigDecimal verdi. Det andre kartet har LocalDate for nøklene og int for sine verdier

3.2. Hash Maps vs Scatter Maps

På grunn av måten nøkkelhashing og distribusjonsfunksjoner tradisjonelt er implementert på, kan vi ha kollisjoner når vi hasher nøklene. Avhengig av hvordan nøkler fordeles, kan dette føre til ytelsesproblemer på store kart. Som standard implementerer HPPC en løsning som unngår dette problemet.

Imidlertid er det fremdeles et sted for kart som har en enklere distribusjonsfunksjon. Dette er nyttig hvis kartene brukes som oppslagstabeller eller for telling, eller hvis de ikke krever mange skriveoperasjoner når de er lastet inn. HHPC gir Spred kart for å øke ytelsen enda mer.

Alle scatter-map-klassene har samme navnekonvensjon som kart, men bruker i stedet ordet Spre:

  • IntScatterSet
  • IntIntScatterMap
  • IntObjectScatterMap

4. Fastutil

Fastutil er et raskt og kompakt rammeverk som gir typespesifikke samlinger inkludert primitive typekart.

4.1. Raskt eksempel

I likhet med Eclipse Collections og HPPC. Fastutil gir også primitive til primitive og primitive til objekttypede tilknytningskart.

La oss lage en int til boolsk kart:

Int2BooleanMap int2BooleanMap = ny Int2BooleanOpenHashMap ();

Og la oss nå legge til noen oppføringer:

int2BooleanMap.put (1, sant); int2BooleanMap.put (7, false); int2BooleanMap.put (4, sant);

Deretter kan vi hente verdier fra det:

boolsk verdi = int2BooleanMap.get (1);

4.2. Iterasjon på stedet

Standard JVM samlinger som implementerer Iterabel grensesnitt oppretter vanligvis et nytt midlertidig iteratorobjekt ved hvert iterasjonstrinn. Med store samlinger kan dette skape et problem med søppelinnsamling.

Fastutil gir et alternativ som i stor grad demper dette:

Int2FloatMap-kart = nytt Int2FloatMap (); // Legg til nøkler her for (Int2FloatMap.Entry e: Fastutil.fastIterable (map)) {// e vil bli gjenbrukt på hver iterasjon, så det vil bare være ett objekt} 

Fastutil gir også fastForeach metode. Dette vil ta en Forbruker funksjonelt grensesnitt og utfør et lambda-uttrykk for hver løkke:

Int2FloatMap-kart = nytt Int2FloatMap (); // Legg til nøkler her Int2FloatMaps.fastForEach (kart, e -> {// e blir også gjenbrukt på tvers av iterasjoner}); 

Dette ligner veldig på standard Java for hver konstruere:

Int2FloatMap-kart = nytt Int2FloatMap (); // Legg til nøkler her map.forEach ((key, value) -> {// use each key / value entry}); 

5. Konklusjon

I denne artikkelen lærte vi hvordan lage primitive kart i Java ved hjelp av Eclipse Collections, HPPC og Fastutil.

Som alltid er eksempelkoden for denne artikkelen tilgjengelig på GitHub.


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