Elenco dei valori interi primitivi in ​​Java

1. Panoramica

In questo tutorial impareremo come costruire un elenco contenente valori interi primitivi .

Esploreremo soluzioni utilizzando Java core e librerie esterne.

2. Boxing automatico

In Java, gli argomenti di tipo generico devono essere tipi di riferimento. Ciò significa che non possiamo fare qualcosa come List .

Invece, possiamo usare List e sfruttare l'autoboxing. L'autoboxing ci aiuta a utilizzare l' interfaccia List come se contenesse valori int primitivi . Sotto il cofano, è ancora una raccolta di Oggetti e non di primitive.

La soluzione Java principale è solo un aggiustamento per poter utilizzare primitive con raccolte generiche. Inoltre, viene fornito con il costo delle conversioni di boxe e unboxing.

Tuttavia, ci sono altre opzioni in Java e librerie di terze parti aggiuntive che possiamo usare. Vediamo di seguito come utilizzarli.

3. Utilizzo dell'API Stream

Spesso, non abbiamo effettivamente bisogno di creare un elenco tanto quanto abbiamo solo bisogno di operare su di esso.

In questi casi, potrebbe funzionare utilizzare l'API Stream di Java 8 invece di creare un elenco del tutto. La classe IntSream fornisce una sequenza di elementi int primitivi che supporta operazioni di aggregazione sequenziali.

Diamo una rapida occhiata a un esempio:

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

Il metodo statico IntStream.of () restituisce un IntStream sequenziale .

Allo stesso modo, possiamo creare un IntStream da un array esistente di int :

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

Inoltre, possiamo applicare le operazioni standard dell'API Stream per iterare, filtrare e aggregare gli int . Ad esempio, possiamo calcolare la media dei valori int positivi :

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

Soprattutto, non viene utilizzato l'autoboxing durante il lavoro con i flussi.

Tuttavia, se abbiamo sicuramente bisogno di un elenco concreto, vorremo dare un'occhiata a una delle seguenti librerie di terze parti.

4. Utilizzo di Trove

Trove è una libreria ad alte prestazioni che fornisce raccolte primitive per Java .

Per configurare Trove con Maven, dobbiamo includere la dipendenza trov4j nel nostro pom.xml :

 net.sf.trove4j trove4j 3.0.2 

Con Trove possiamo creare elenchi, mappe e set.

Ad esempio, esiste un'interfaccia TIntList con la sua implementazione TIntArrayList per lavorare con un elenco di valori int :

TIntList tList = new TIntArrayList();

Anche se TIntList non può implementare direttamente List , i suoi metodi sono molto comparabili. Altre soluzioni che discutiamo seguono uno schema simile.

Il più grande vantaggio dell'utilizzo di TIntArrayList è l' aumento delle prestazioni e del consumo di memoria . Non è necessario alcun boxing / unboxing aggiuntivo poiché memorizza i dati all'interno di un array int [] .

5. Utilizzo di Fastutil

Un'altra libreria ad alte prestazioni per lavorare con le primitive è Fastutil. Aggiungiamo la dipendenza fastutil :

 it.unimi.dsi fastutil 8.1.0 

Ora siamo pronti per usarlo:

IntArrayList list = new IntArrayList();

Il costruttore predefinito IntArrayList () crea internamente un array di primitive con la capacità predefinita di 16 . Allo stesso modo, possiamo inizializzarlo da un array esistente:

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

6. Utilizzo di Colt

Colt è un open source, una libreria ad alte prestazioni per il calcolo tecnico e scientifico . Il pacchetto cern.colt contiene elenchi ridimensionabili contenenti tipi di dati primitivi come int .

Per prima cosa, aggiungiamo la dipendenza da puledro :

 colt colt 1.2.0 

La lista primitiva che offre questa libreria è cern.colt.list.IntArrayList:

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

La capacità iniziale predefinita è dieci.

7. Utilizzando Guava

Guava fornisce una serie di modi per interfacciarsi tra array primitivi e API di raccolta . Il pacchetto com.google.common.primitives ha tutte le classi per ospitare i tipi primitivi.

Ad esempio, la classe ImmutableIntArray ci consente di creare un elenco immutabile di elementi int .

Supponiamo di avere il seguente array di valori int :

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

Possiamo semplicemente creare un elenco con l'array:

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

Inoltre, fornisce una lista API con tutti i metodi standard che ci aspetteremmo.

8. Conclusione

In questo rapido articolo, abbiamo mostrato diversi modi per creare elenchi con i numeri interi primitivi . Nei nostri esempi, abbiamo utilizzato le librerie Trove, Fastutil, Colt e Guava .

Come al solito, il codice completo di questo articolo è disponibile su GitHub.