Kort over primitiver i Java

1. Oversigt

I denne vejledning lærer vi hvordan man konstruerer et kort med primitive nøgler og værdier.

Som vi ved, kernen Java Korts tillader ikke lagring af primitive nøgler eller værdier. Derfor introducerer vi nogle eksterne tredjepartsbiblioteker, der leverer primitive kortimplementeringer.

2. Formørkelsessamlinger

Eclipse Collections er en højtydende indsamlingsramme til Java. Det giver forbedrede implementeringer samt nogle yderligere datastrukturer, herunder flere primitive samlinger.

2.1. Omskiftelig og uforanderlig Kort

Lad os oprette et tomt kort, hvor både nøgler og værdier er primitive ints. Til det bruger vi IntIntMaps fabriksklasse:

MutableIntIntMap mutableIntIntMap = IntIntMaps.mutable.empty ();

Det IntIntMaps fabriksklasse er den mest bekvemme måde at oprette primitive kort på. Det giver os mulighed for at oprette både foranderlige og uforanderlige forekomster af den ønskede type kort. I vores eksempel oprettede vi den ændrede forekomst af IntIntMap. På samme måde kan vi oprette en uforanderlig forekomst ved blot at erstatte IntIntMaps.mutable statisk fabriksopkald med IntIntMaps.immutable:

ImmutableIntIntMap immutableIntIntMap = IntIntMaps.immutable.empty ();

Så lad os tilføje et nøgleværdipar til vores ændrede kort:

mutableIntIntMap.addToValue (1, 1);

Ligeledes, vi kan oprette blandede kort med reference- og primitive type nøgleværdipar. Lad os oprette et kort med Snor taster og dobbelt værdier:

MutableObjectDoubleMap dObject = ObjectDoubleMaps.mutable.empty ();

Her brugte vi ObjectDoubleMaps fabriksklasse for at oprette en ændret instans for MutableObjectDoubleMap.

Lad os nu tilføje nogle poster:

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

2.2. Et primitivt API-træ

I Eclipse Collections er der en base-interface kaldet PrimitivIterabel. Dette er basisgrænsefladen for hver af de primitive beholdere i biblioteket. Alle er navngivet PrimitiveTypeIterable, hvor Primitive Type måske Int, lang, Kort, Byte, Char, Flyde, Dobbelt, eller Boolsk.

Alle disse basisgrænseflader har igen deres træ af XYKort implementeringer, hvilket er delt på, om kortet er ændret eller uforanderligt. Som et eksempel til IntIntMap, vi har MutableIntIntMap og ImmutableIntIntMap.

Endelig, som vi så ovenfor, har vi det grænseflader til at dække alle slags kombinationer af typer til nøgler og værdier for både primitive og objektværdier. Så for eksempel kan vi have IntObjectMap for en primitiv nøgle med en Objekt værdi eller ObjectIntMap for det modsatte tilfælde.

3. HPPC

HPPC er et bibliotek rettet mod høj ydeevne og hukommelseseffektivitet. Dette betyder, at biblioteket har mindre abstraktion end andre. Dette har dog fordelen ved at udsætte internerne for nyttig manipulation på lavt niveau. Det giver både kort og sæt.

3.1. Et simpelt eksempel

Lad os starte med at oprette et kort, der har et int nøgle og en lang værdi. Brug af dette er ret kendt:

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

HPPC leverer kort til alle kombinationer af nøgler og værdier:

  • Primitiv nøgle og primitiv værdi
  • Primitiv nøgle og objekttype værdi
  • Objektypenøgle og primitiv værdi
  • Både Objekt-type nøgle og værdi

Objekt-type kort understøtter generiske:

IntObjectOpenHashMap ObjectIntOpenHashMap 

Det første kort har et primitivt int nøgle og en BigDecimal værdi. Det andet kort har LocalDate for dens nøgler og int for dets værdier

3.2. Hash-kort vs scatter-kort

På grund af den måde, hvorpå nøglehashing og distributionsfunktioner traditionelt implementeres, kan vi have kollisioner, når nøglehashing. Afhængigt af hvordan nøgler fordeles, kan dette føre til ydeevneproblemer på enorme kort. Som standard implementerer HPPC en løsning, der undgår dette problem.

Der er dog stadig et sted for kort, der har en enklere distributionsfunktion. Dette er nyttigt hvis kortene bruges som opslagstabeller eller til optælling, eller hvis de ikke kræver mange skriveoperationer, når de først er indlæst. HHPC leverer Spred kort for at øge ydeevnen endnu mere.

Alle scatter-kortklasser opretholder den samme navngivningskonvention som kort, men bruger i stedet ordet Sprede:

  • IntScatterSet
  • IntIntScatterMap
  • IntObjectScatterMap

4. Fastutil

Fastutil er en hurtig og kompakt ramme der giver typespecifikke samlinger inklusive primitive typekort.

4.1. Hurtigt eksempel

Svarende til Eclipse Collections og HPPC. Fastutil leverer også primitive til primitive og primitive til objekttypede associeringskort.

Lad os oprette en int til boolsk kort:

Int2BooleanMap int2BooleanMap = ny Int2BooleanOpenHashMap ();

Og nu, lad os tilføje nogle poster:

int2BooleanMap.put (1, sand); int2BooleanMap.put (7, false); int2BooleanMap.put (4, sandt);

Derefter kan vi hente værdier fra det:

boolsk værdi = int2BooleanMap.get (1);

4.2. Iteration på stedet

Standard JVM-samlinger, der implementerer Iterabel interface opretter normalt et nyt midlertidigt iteratorobjekt ved hvert iterationstrin. Med store samlinger kan dette skabe et affaldsindsamlingsproblem.

Fastutil giver et alternativ, der i høj grad mildner dette:

Int2FloatMap-kort = nyt Int2FloatMap (); // Tilføj nøgler her til (Int2FloatMap.Entry e: Fastutil.fastIterable (map)) {// e genbruges på hver iteration, så det vil kun være et objekt} 

Fastutil leverer også fastForeach metode. Dette vil tage en Forbruger funktionel grænseflade og udføre et lambda-udtryk for hver løkke:

Int2FloatMap-kort = nyt Int2FloatMap (); // Tilføj nøgler her Int2FloatMaps.fastForEach (kort, e -> {// e genbruges også på tværs af iterationer}); 

Dette svarer meget til standard Java for hver konstruere:

Int2FloatMap-kort = nyt Int2FloatMap (); // Tilføj nøgler her map.forEach ((nøgle, værdi) -> {// brug hver nøgle / værdiindgang}); 

5. Konklusion

I denne artikel lærte vi, hvordan vi gør det Opret primitive kort i Java ved hjælp af Eclipse Collections, HPPC og Fastutil.

Som altid er eksempelkoden til denne artikel tilgængelig på GitHub.


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