Karta primitiva u Javi

1. Pregled

U ovom uputstvu naučit ćemo kako konstruirati kartu s primitivnim ključevima i vrijednostima.

Kao što znamo, jezgra Java Kartas ne dopuštaju pohranu primitivnih ključeva ili vrijednosti. Zbog toga ćemo predstaviti neke vanjske biblioteke trećih strana koje pružaju primitivne implementacije mapa.

2. Zbirke pomrčine

Eclipse Collections je okvir za prikupljanje visokih performansi za Javu. Pruža poboljšane implementacije, kao i neke dodatne strukture podataka, uključujući nekoliko primitivnih zbirki.

2.1. Promjenjivo i nepromjenjivo Karte

Stvorimo praznu mapu u kojoj su i ključevi i vrijednosti primitivni ints. Za to ćemo upotrijebiti IntIntMaps tvornička klasa:

MutableIntIntMap mutableIntIntMap = IntIntMaps.mutable.empty ();

The IntIntMaps tvornička klasa je najprikladniji način za stvaranje primitivnih karata. Omogućuje nam stvaranje i promjenjivih i nepromjenjivih primjera željene vrste karte. U našem smo primjeru stvorili promjenjivu instancu IntIntMap. Slično tome, možemo stvoriti nepromjenjivu instancu jednostavnom zamjenom IntIntMaps.mutable statički tvornički poziv sa IntIntMaps.immutable:

ImmutableIntIntMap immutableIntIntMap = IntIntMaps.immutable.empty ();

Dakle, dodajmo par ključeva, vrijednosti na našu promjenjivu kartu:

mutableIntIntMap.addToValue (1, 1);

Također, možemo stvoriti mješovite karte s referentnim i primitivnim parovima ključ / vrijednost. Stvorimo kartu s Niz tipke i dvostruko vrijednosti:

MutableObjectDoubleMap dObject = ObjectDoubleMaps.mutable.empty ();

Ovdje smo koristili ObjectDoubleMaps tvornička klasa za stvaranje promjenjive instance za MutableObjectDoubleMap.

Sad dodajmo neke unose:

dObject.addToValue ("cijena", 150,5); dObject.addToValue ("kvaliteta", 4.4); dObject.addToValue ("stabilnost", 0,8);

2.2. Primitivno API stablo

U Eclipse Collections postoji osnovno sučelje zvano PrimitivnoIterati. Ovo je osnovno sučelje za svaki od primitivnih spremnika knjižnice. Svi su imenovani PrimitiveTypeIterable, gdje PrimitiveType Može biti Int, dugo, Kratak, Bajt, Char, Plutati, Dvostruko, ili Booleova.

Sva ta osnovna sučelja zauzvrat imaju svoje stablo XYKarta implementacije, što je podijeljeno po tome je li karta promjenjiva ili nepromjenjiva. Kao primjer, za IntIntMap, imamo MutableIntIntMap i ImmutableIntIntMap.

Napokon, kao što smo vidjeli gore, jesmo sučelja za pokrivanje svih vrsta kombinacija tipova za ključeve i vrijednosti za primitivne i objektne vrijednosti. Tako, na primjer, možemo imati IntObjectMap za primitivni ključ s Objekt vrijednost ili ObjectIntMap za njegov suprotni slučaj.

3. HPPC

HPPC je knjižnica usmjerena prema visokim performansama i učinkovitosti memorije. To znači da knjižnica ima manje apstrakcije od ostalih. Međutim, ovo ima prednost izlaganja unutrašnjih dijelova korisnim manipulacijama na niskoj razini. Pruža i karte i skupove.

3.1. Jednostavan primjer

Počnimo s izradom karte koja ima int tipka i a dugo vrijednost. Korištenje ovoga prilično je poznato:

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

HPPC nudi mape za sve kombinacije tipki i vrijednosti:

  • Primitivni ključ i primitivna vrijednost
  • Primitivni ključ i vrijednost tipa objekta
  • Tip objekta i primitivna vrijednost
  • I tip objekta i vrijednost

Karte tipa objekta podržavaju generičke lijekove:

IntObjectOpenHashMap ObjectIntOpenHashMap 

Prva karta ima primitiv int tipka i a BigDecimal vrijednost. Druga karta ima LocalDate za svoje ključeve i int za svoje vrijednosti

3.2. Karte hasha vs Scatter Maps

Zbog načina na koji se tradicionalno implementiraju funkcije raspršivanja i distribucije ključeva, mogli bismo doći do sudara prilikom raspršivanja tipki. Ovisno o načinu distribucije tipki, to može dovesti do problema s performansama na ogromnim kartama. Prema zadanim postavkama HPPC implementira rješenje kojim se izbjegava ovaj problem.

Međutim, još uvijek postoji mjesto za karte koje imaju jednostavniju funkciju distribucije. Ovo je korisno ako se karte koriste kao tablice pretraživanja ili za brojanje ili ako ne zahtijevaju puno operacija pisanja nakon učitavanja. HHPC pruža Razbacane karte za još veće poboljšanje performansi.

Sve klase raspršenih mapa održavaju istu konvenciju imenovanja kao mape, ali umjesto toga koriste riječ Raspršiti:

  • IntScatterSet
  • IntIntScatterMap
  • IntObjectScatterMap

4. Fastutil

Fastutil je brz i kompaktan okvir koja pruža zbirke specifične za tip, uključujući primitivne karte tipa.

4.1. Brzi primjer

Slično zbirkama Eclipse i HPPC. Fastutil također pruža primitivne do primitivne i primitivne prema objektu tipizirane mape asocijacija.

Stvorimo int do boolean karta:

Int2BooleanMap int2BooleanMap = novo Int2BooleanOpenHashMap ();

A sada, dodajmo nekoliko unosa:

int2BooleanMap.put (1, istina); int2BooleanMap.put (7, netačno); int2BooleanMap.put (4, istina);

Tada iz njega možemo dohvatiti vrijednosti:

logička vrijednost = int2BooleanMap.get (1);

4.2. Iteracija na mjestu

Standardne JVM kolekcije koje implementiraju Iterativ sučelje obično stvara svježi privremeni objekt iteratora u svakom koraku iteracije. S ogromnim zbirkama to može stvoriti problem sa odvozom smeća.

Fastutil nudi alternativu koja ovo uvelike ublažava:

Karta Int2FloatMap = nova Int2FloatMap (); // Ovdje dodajte ključeve za (Int2FloatMap.Entry e: Fastutil.fastIterable (map)) {// e će se ponovno koristiti na svakoj iteraciji, pa će to biti samo jedan objekt} 

Fastutil također nudi fastForeach metoda. Ovo će potrajati Potrošač funkcionalno sučelje i izvedite lambda-izraz za svaku petlju:

Karta Int2FloatMap = nova Int2FloatMap (); // Ovdje dodajte ključeve Int2FloatMaps.fastForEach (map, e -> {// e se također ponovno koristi u iteracijama}); 

Ovo je vrlo slično standardnoj Javi za svakoga konstruirati:

Karta Int2FloatMap = nova Int2FloatMap (); // Ovdje dodajte ključeve map.forEach ((ključ, vrijednost) -> {// koristite svaki unos ključa / vrijednosti}); 

5. Zaključak

U ovom smo članku naučili kako stvoriti primitivne mape u Javi pomoću Eclipse Collections, HPPC i Fastutil.

Kao i uvijek, primjer koda za ovaj članak dostupan je na GitHubu.


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