Lista över primitiva heltalsvärden i Java

1. Översikt

I den här handledningen lär vi oss hur man konstruerar en lista som innehåller primitiva heltalsvärden .

Vi utforskar lösningar med hjälp av kärnan i Java och externa bibliotek.

2. Autoboxing

I Java måste generiska typargument vara referenstyper. Det betyder att vi inte kan göra något som List .

Istället kan vi använda List och dra nytta av autoboxing. Autoboxing hjälper oss använda List gränssnitt som om den innehöll primitiva int värden. Under huven är det fortfarande en samling objekt och inte primitiver.

Java-kärnlösningen är bara en justering för att kunna använda primitiva med generiska samlingar. Dessutom kommer det med kostnaden för boxnings- och unboxing-omvandlingar.

Det finns dock andra alternativ i Java och ytterligare tredjepartsbibliotek som vi kan använda. Låt oss se hur du använder dem nedan.

3. Använda Stream API

Ofta behöver vi faktiskt inte skapa en lista så mycket som vi bara behöver använda den.

I dessa fall kan det fungera att använda Java 8: s Stream API istället för att skapa en lista helt. Den IntSream klassen innehåller en sekvens av primitiva int element som stödjer sekventiella krossverksamheten.

Låt oss ta en snabb titt på ett exempel:

IntStream stream = IntStream.of(5, 10, 0, 2, -8);

Den statiska metoden IntStream.of () returnerar en sekventiell IntStream .

På samma sätt kan vi skapa en IntStream från en befintlig grupp med ints :

int[] primitives = {5, 10, 0, 2, -8}; IntStream stream = IntStream.of(primitives);

Dessutom kan vi tillämpa de vanliga Stream API-operationerna för att itera, filtrera och aggregera interna . Till exempel kan vi beräkna genomsnittet av de positiva int- värdena:

OptionalDouble average = stream.filter(i -> i > 0).average();

Viktigast är att ingen autoboxing används när du arbetar med strömmarna.

Men om vi definitivt behöver en konkret lista, vill vi ta en titt på ett av följande tredjepartsbibliotek.

4. Använda Trove

Trove är ett högpresterande bibliotek som tillhandahåller primitiva samlingar för Java .

För att ställa in Trove with Maven måste vi inkludera trov4j- beroendet i vår pom.xml :

 net.sf.trove4j trove4j 3.0.2 

Med Trove kan vi skapa listor, kartor och uppsättningar.

Till exempel finns det ett gränssnitts- TIntList med dess TIntArrayList- implementering för att arbeta med en lista med int- värden:

TIntList tList = new TIntArrayList();

Även om TIntList inte direkt kan implementera List är metoderna mycket jämförbara. Andra lösningar som vi diskuterar följer ett liknande mönster.

Den största fördelen med att använda TIntArrayList är prestanda och minnesförbrukningsvinster . Ingen ytterligare boxning / avboxning behövs eftersom den lagrar data inuti en int [] array.

5. Använda Fastutil

Ett annat högpresterande bibliotek för att arbeta med primitiverna är Fastutil. Låt oss lägga till fastutil beroende:

 it.unimi.dsi fastutil 8.1.0 

Nu är vi redo att använda den:

IntArrayList list = new IntArrayList();

Standardkonstruktören IntArrayList () skapar internt en uppsättning primitiv med standardkapaciteten 16 . På samma sätt kan vi initiera det från en befintlig matris:

int[] primitives = new int[] {5, 10, 0, 2, -8}; IntArrayList list = new IntArrayList(primitives);

6. Använda Colt

Colt är en öppen källkod, ett högpresterande bibliotek för vetenskaplig och teknisk databehandling . Den cern.colt Paketet innehåller resizable listor håller primitiva datatyper såsom int .

Låt oss först lägga till coltberoendet :

 colt colt 1.2.0 

Den primitiva listan som erbjuder detta bibliotek är cern.colt.list.IntArrayList:

cern.colt.list.IntArrayList coltList = new cern.colt.list.IntArrayList();

Standardstartkapaciteten är tio.

7. Använda Guava

Guava tillhandahåller ett antal sätt att gränssnitt mellan primitiva matriser och samlings-API: er . Den com.google.common.primitives paketet har alla klasser för att rymma primitiva typer.

Med klassen ImmutableIntArray kan vi till exempel skapa en oföränderlig lista med int- element.

Låt oss anta att vi har följande array med int- värden:

int[] primitives = new int[] {5, 10, 0, 2};

Vi kan helt enkelt skapa en lista med matrisen:

ImmutableIntArray list = ImmutableIntArray.builder().addAll(primitives).build();

Dessutom ger det en lista API med alla standardmetoder som vi förväntar oss.

8. Slutsats

I den här snabba artikeln visade vi flera sätt att skapa listor med primitiva heltal . I våra exempel använde vi biblioteken Trove, Fastutil, Colt och Guava .

Som vanligt finns den fullständiga koden för den här artikeln tillgänglig på GitHub.