Liste des valeurs entières primitives en Java

1. Vue d'ensemble

Dans ce didacticiel, nous allons apprendre à construire une liste contenant des valeurs entières primitives .

Nous explorerons des solutions en utilisant le noyau Java et des bibliothèques externes.

2. Autoboxing

En Java, les arguments de type générique doivent être des types référence. Cela signifie que nous ne pouvons pas faire quelque chose comme List .

Au lieu de cela, nous pouvons utiliser List et profiter de l'auto-box. La boxe automatique nous aide à utiliser l' interface de liste comme si elle contenait des valeurs int primitives . Sous le capot, c'est toujours une collection d' objets et non de primitifs.

La solution Java principale est juste un ajustement pour pouvoir utiliser des primitives avec des collections génériques. De plus, cela vient avec le coût des conversions de boxe et de déballage.

Cependant, il existe d'autres options en Java et des bibliothèques tierces supplémentaires que nous pouvons utiliser. Voyons comment les utiliser ci-dessous.

3. Utilisation de l'API Stream

Souvent, nous n'avons pas besoin de créer une liste autant que nous avons juste besoin de l'utiliser.

Dans ces cas, il peut fonctionner d'utiliser l'API Stream de Java 8 au lieu de créer une liste. La classe IntSream fournit une séquence d' éléments int primitifs qui prend en charge les opérations d'agrégation séquentielles.

Jetons un coup d'œil à un exemple:

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

La méthode statique IntStream.of () renvoie un IntStream séquentiel .

De même, nous pouvons créer un IntStream à partir d'un tableau existant d' entiers :

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

De plus, nous pouvons appliquer les opérations standard de l'API Stream pour itérer, filtrer et agréger les ints . Par exemple, nous pouvons calculer la moyenne des valeurs int positives :

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

Plus important encore, aucune boîte automatique n'est utilisée lorsque vous travaillez avec les flux.

Cependant, si nous avons vraiment besoin d'une liste concrète, nous voudrons jeter un coup d'œil à l'une des bibliothèques tierces suivantes.

4. Utilisation de Trove

Trove est une bibliothèque haute performance qui fournit des collections primitives pour Java .

Pour configurer Trove avec Maven, nous devons inclure la dépendance trov4j dans notre pom.xml :

 net.sf.trove4j trove4j 3.0.2 

Avec Trove, nous pouvons créer des listes, des cartes et des ensembles.

Par exemple, il existe une interface TIntList avec son implémentation TIntArrayList pour travailler avec une liste de valeurs int :

TIntList tList = new TIntArrayList();

Même si TIntList ne peut pas implémenter directement List , ses méthodes sont très comparables. D'autres solutions dont nous discutons suivent un schéma similaire.

Le plus grand avantage de l'utilisation de TIntArrayList réside dans les gains de performances et de consommation de mémoire . Aucun boxing / unboxing supplémentaire n'est nécessaire car il stocke les données à l'intérieur d'un tableau int [] .

5. Utilisation de Fastutil

Une autre bibliothèque haute performance pour travailler avec les primitives est Fastutil. Ajoutons la dépendance fastutil :

 it.unimi.dsi fastutil 8.1.0 

Maintenant, nous sommes prêts à l'utiliser:

IntArrayList list = new IntArrayList();

Le constructeur par défaut IntArrayList () crée en interne un tableau de primitives avec la capacité par défaut de 16 . Dans le même esprit, nous pouvons l'initialiser à partir d'un tableau existant:

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

6. Utilisation de Colt

Colt est une open source, une bibliothèque performante pour le calcul scientifique et technique . Le package cern.colt contient des listes redimensionnables contenant des types de données primitifs tels que int .

Tout d'abord, ajoutons la dépendance colt :

 colt colt 1.2.0 

La liste primitive qui propose cette bibliothèque est cern.colt.list.IntArrayList:

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

La capacité initiale par défaut est de dix.

7. Utilisation de la goyave

Guava fournit un certain nombre de moyens d'interfaçage entre les tableaux primitifs et les API de collection . Le package com.google.common.primitives contient toutes les classes pour accueillir les types primitifs.

Par exemple, la ImmutableIntArray classe nous permet de créer une liste immuable des int éléments.

Supposons que nous ayons le tableau suivant de valeurs int :

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

Nous pouvons simplement créer une liste avec le tableau:

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

De plus, il fournit une API de liste avec toutes les méthodes standard que nous attendons.

8. Conclusion

Dans cet article rapide, nous avons montré plusieurs façons de créer des listes avec les entiers primitifs . Dans nos exemples, nous avons utilisé les bibliothèques Trove, Fastutil, Colt et Guava .

Comme d'habitude, le code complet de cet article est disponible à l'adresse over sur GitHub.