Créer une liste de primitifs int?

94

Existe-t-il un moyen de créer une liste d'entiers primitifs ou de primitives en java comme suit?

List<int> myList = new ArrayList<int>();

Il semble que je peux faire List myList = new ArrayList();

et ajoutez "int" dans cette liste. Mais alors cela signifierait que je peux ajouter n'importe quoi à cette liste.

Est-ce que ma seule option est de créer un tableau d'entiers et de le convertir en liste ou de créer une liste d'objets Integer?

Susie
la source
Si la performance est votre préoccupation, trove devrait vous aider.
assylias
Il est possible de créer une liste à l'aide d'un tableau de base, mais vous devez connaître la taille du tableau pour commencer, et vous perdrez de nombreuses autres fonctionnalités fournies avec l'objet Collections. Mais vous pouvez faire quelque chose comme: int [] array = new int [10];
Taylor

Réponses:

141

En Java, le type de toute variable est soit un type primitif, soit un type référence. Les arguments de type générique doivent être des types référence. Comme les primitives ne s'étendent pas, Objectelles ne peuvent pas être utilisées comme arguments de type générique pour un type paramétré.

Utilisez plutôt la Integerclasse qui est un wrapper pour int:

List<Integer> list = new ArrayList<Integer>();

Si vous utilisez Java 7, vous pouvez simplifier cette déclaration en utilisant l'opérateur losange:

List<Integer> list = new ArrayList<>();

Avec l'autoboxing en Java, le type primitif intdeviendra un Integersi nécessaire.

L'autoboxing est la conversion automatique que le compilateur Java effectue entre les types primitifs et leurs classes d'encapsuleur d'objets correspondantes.

Donc, ce qui suit est valide:

int myInt = 1;
List<Integer> list = new ArrayList<Integer>();
list.add(myInt);

System.out.println(list.get(0)); //prints 1
Kevin Bowersox
la source
Donc, la méthode JTable setSelectedIndices est un non-sens: docs.oracle.com/javase/8/docs/api/javax/swing/…
vdolez
25

Non, aucune collection ne peut contenir des types primitifs lorsque Java Collection Framework est utilisé.

Cependant, il existe d'autres collections java qui prennent en charge les types primitifs, tels que: Trove , Colt , Fastutil , Guava

Voici un exemple de la façon dont une arraylist avec ints serait lorsque Trove Library était utilisée:

 TIntArrayList list= new TIntArrayList();

Les performances de cette liste, par rapport à la ArrayList of Integers de Java Collections, sont bien meilleures, car l'autoboxing / unboxing vers la classe Integer Wrapper correspondante n'est pas nécessaire.

Mike B
la source
1
Je n'ai pas trouvé d'implémentation de collection primitive dans Guava. Pouvez-vous fournir un lien s'il vous plaît?
nimcap
9

Existe-t-il un moyen de créer une liste d'entiers primitifs ou de toutes les primitives en java

Non, tu ne peux pas. Vous ne pouvez créer Liste des types de référence, comme Integer, Stringou votre type personnalisé.

Il semble que je peux faire List myList = new ArrayList();et ajouter "int" dans cette liste.

Lorsque vous ajoutez intà cette liste, il est automatiquement encadré au Integertype de wrapper. Mais c'est une mauvaise idée d'utiliser des listes de types bruts , ou pour tout type générique d'ailleurs, dans du code plus récent.

Je peux ajouter n'importe quoi à cette liste.

Bien sûr, c'est le désavantage d'utiliser le type brut. Vous pouvez avoir un chat , un chien , un tigre , un dinosaure , le tout dans un seul conteneur.

Est ma seule option, créer un tableau de int et le convertir en une liste

Dans ce cas également, vous obtiendrez un List<Integer>seul. Il n'y a aucun moyen de créer List<int>ou de créer des primitives.

Vous ne devriez pas être dérangé de toute façon. Même dans List<Integer>vous pouvez ajouter un inttypes primitifs. Il sera automatiquement encadré, comme dans l'exemple ci-dessous:

List<Integer> list = new ArrayList<Integer>();
list.add(5);
Rohit Jain
la source
Bonne discussion sur le type brut.
Kevin Bowersox
En fait, pour être clair, vous pouvez créer une liste avec des types primitifs en utilisant simplement un tableau de base. int [] tableau = nouveau int [10];
Taylor
1
@Taylor Mais ce ne sera pas la liste qui augmentera dynamiquement. C'est un tableau. Et je suppose qu'OP le savait déjà.
Rohit Jain
5

Ce n'est pas possible. La spécification java interdit l'utilisation de primitives dans les génériques. Cependant, vous pouvez créer ArrayList<Integer>et appeler add(i)if iest un int grâce à la boxe.

nanofarad
la source
4

Vous pouvez utiliser des collections primitives disponibles dans les collections Eclipse . Eclipse Collections a List, Set, BagetMap pour toutes les primitives. Les éléments des collections primitives sont conservés comme primitifs et aucune boxe n'a lieu.

Vous pouvez initialiser une IntList comme ceci:

MutableIntList ints = IntLists.mutable.empty();

Vous pouvez convertir de a List<Integer>en IntListcomme ceci:

List<Integer> integers = new ArrayList<>();
MutableIntList ints = ListAdapter.adapt(integers).collectInt(each -> each);

Remarque: je suis un contributeur aux collections Eclipse.

Nikhil Nanivadekar
la source
2

Les collections utilisent des génériques qui prennent en charge les types de référence ou les wilcards. Vous pouvez cependant utiliser un Integerwrapper

List<Integer> list = new ArrayList<>();
Reimeus
la source
0

Lorsque vous utilisez Java pour le développement Android, il est recommandé de l'utiliser SparseIntArraypour empêcher la détection automatique entre intet Integer.

Vous pouvez trouver plus d'informations SparseIntArraydans la documentation des développeurs Android et une bonne explication pour l'autoboxing sur Android, entrez la description du lien ici

Stefan Medack
la source
C'est une déclaration forte. C'est certainement SparseIntArrayune meilleure option, mais il y a des compromis à prendre en compte. "La mise en œuvre n'est pas destinée à être appropriée pour les structures de données qui peuvent contenir un grand nombre d'éléments. Elle est généralement plus lente qu'un HashMap traditionnel ..."
Andy Thomas
Oui c'est vrai. Ils couvrent assez bien ce compromis dans la vidéo que j'ai liée. Mais l'OP a demandé cette possibilité particulière et je voulais juste ajouter qu'elle est réellement possible avec Android et également recommandée pour la plupart des cas d'utilisation. Merci d'avoir ajouté ces informations!
Stefan Medack
0

Existe-t-il un moyen de convertir un tableau Integer [] en tableau int []?

Cette omission flagrante des bibliothèques de base Java semble se produire sur à peu près tous les projets sur lesquels je travaille. Et aussi pratique que puisse être la bibliothèque Trove, je suis incapable d'analyser les exigences précises pour répondre à LPGL pour une application Android qui lie statiquement une bibliothèque LGPL (le préambule dit ok, le corps ne semble pas dire la même chose). Et il est tout simplement gênant de récupérer les sources Apache pour obtenir ces classes. Il doit y avoir une meilleure façon.

Robin Davies
la source
-4

La collection Java doit être constituée uniquement de collections d'objets.

List<Integer> integerList = new ArrayList<Integer>();

Integer est la classe wrapper du type de données primitif int.

plus de classes de wrapper JAVA ici !

U peut directement enregistrer et obtenir int vers / depuis integerList comme, integerList.add(intValue); int intValue = integerList.get(i)

Selvaraj
la source
1
La première ligne ne se compile pas et les deux dernières lignes de code sont partout. Veuillez vous abstenir de le faire.
The_Martian