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?
java
list
generics
collections
Susie
la source
la source
Réponses:
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,
Object
elles ne peuvent pas être utilisées comme arguments de type générique pour un type paramétré.Utilisez plutôt la
Integer
classe qui est un wrapper pourint
:Si vous utilisez Java 7, vous pouvez simplifier cette déclaration en utilisant l'opérateur losange:
Avec l'autoboxing en Java, le type primitif
int
deviendra unInteger
si nécessaire.Donc, ce qui suit est valide:
la source
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:
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.
la source
Non, tu ne peux pas. Vous ne pouvez créer Liste des types de référence, comme
Integer
,String
ou votre type personnalisé.Lorsque vous ajoutez
int
à cette liste, il est automatiquement encadré auInteger
type 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.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.
Dans ce cas également, vous obtiendrez un
List<Integer>
seul. Il n'y a aucun moyen de créerList<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 unint
types primitifs. Il sera automatiquement encadré, comme dans l'exemple ci-dessous:la source
Essayez d'utiliser ArrayIntList du framework Apache. Il fonctionne exactement comme un arraylist, sauf qu'il peut contenir des int primitifs.
Plus de détails ici -
https://commons.apache.org/dormant/commons-primitives/apidocs/org/apache/commons/collections/primitives/ArrayIntList.html
la source
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 appeleradd(i)
ifi
est un int grâce à la boxe.la source
Vous pouvez utiliser des collections primitives disponibles dans les collections Eclipse . Eclipse Collections a
List
,Set
,Bag
etMap
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:
Vous pouvez convertir de a
List<Integer>
enIntList
comme ceci:Remarque: je suis un contributeur aux collections Eclipse.
la source
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
Integer
wrapperla source
Lorsque vous utilisez Java pour le développement Android, il est recommandé de l'utiliser
SparseIntArray
pour empêcher la détection automatique entreint
etInteger
.Vous pouvez trouver plus d'informations
SparseIntArray
dans la documentation des développeurs Android et une bonne explication pour l'autoboxing sur Android, entrez la description du lien icila source
SparseIntArray
une 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 ..."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.
la source
La collection Java doit être constituée uniquement de collections d'objets.
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)
la source