¿Crear una lista de int primitivos?

97

¿Hay alguna manera de crear una lista de int primitivos o cualquier primitivo en java como sigue?

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

Parece que puedo hacer List myList = new ArrayList();

y agregue "int" en esta lista. Pero entonces esto significaría que puedo agregar cualquier cosa a esta lista.

¿Mi única opción es crear una matriz de int y convertirla en una lista o crear una lista de objetos Integer?

Susie
fuente
Si el rendimiento es lo que le preocupa, trove debería ayudarlo.
assylias
Es posible crear una lista usando una matriz básica, pero para empezar, debe conocer el tamaño de la matriz y perderá muchas otras funciones que vienen con el objeto Colecciones. Pero podría hacer algo como: int [] array = new int [10];
Taylor

Respuestas:

144

En Java, el tipo de cualquier variable es un tipo primitivo o un tipo de referencia. Los argumentos de tipo genérico deben ser tipos de referencia. Dado que las primitivas no se extienden Object, no se pueden utilizar como argumentos de tipo genérico para un tipo parametrizado.

En su lugar, use la Integerclase que es un contenedor para int:

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

Si usa Java 7, puede simplificar esta declaración usando el operador de diamante:

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

Con el autoboxing en Java, el tipo primitivo intse convertirá en an Integercuando sea necesario.

Autoboxing es la conversión automática que realiza el compilador de Java entre los tipos primitivos y sus clases de envoltura de objetos correspondientes.

Entonces lo siguiente es válido:

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

System.out.println(list.get(0)); //prints 1
Kevin Bowersox
fuente
1
Entonces, el método JTable setSelectedIndices no tiene sentido: docs.oracle.com/javase/8/docs/api/javax/swing/…
vdolez
25

No, no hay ninguna colección que pueda contener tipos primitivos cuando se utiliza Java Collection Framework.

Sin embargo, hay otras colecciones de Java que admiten tipos primitivos, como: Trove , Colt , Fastutil , Guava

Un ejemplo de cómo sería una lista de matrices con ints cuando se usara la biblioteca Trove es el siguiente:

 TIntArrayList list= new TIntArrayList();

El rendimiento de esta lista, en comparación con el ArrayList of Integers de Java Collections es mucho mejor, ya que no se necesita el autoboxing / unboxing a la correspondiente Integer Wrapper Class.

Mike B
fuente
1
No pude encontrar una implementación de colección primitiva en Guava. ¿Puede proporcionar un enlace por favor?
nimcap
9

¿Hay alguna manera de crear una lista de int primitivos o cualquier primitivo en java?

No, no puedes. Sólo se puede crear una lista de los tipos de referencia, al igual que Integer, Stringo el tipo personalizado.

Parece que puedo hacer List myList = new ArrayList();y agregar "int" a esta lista.

Cuando agrega inta esta lista, se coloca automáticamente en un Integercuadro de tipo contenedor. Pero es una mala idea usar primas tipos de listas, o para cualquier tipo genérico para el caso, en el código más reciente.

Puedo agregar cualquier cosa a esta lista.

Por supuesto, esa es la desventaja de utilizar el tipo sin formato. Puede tener gato , perro , tigre , dinosaurio , todo en un contenedor.

Es mi única opción, crear una matriz de int y convertirla en una lista

En ese caso también, obtendrá un List<Integer>único. No hay forma de que puedas crear List<int>ni primitivas.

De todos modos, no debería molestarse. Incluso en List<Integer>puede agregar inttipos primitivos. Se incluirá automáticamente en una caja, como en el siguiente ejemplo:

List<Integer> list = new ArrayList<Integer>();
list.add(5);
Rohit Jain
fuente
Buena discusión sobre el tipo crudo.
Kevin Bowersox
En realidad, para que quede claro, puede crear una lista con tipos primitivos simplemente usando una matriz básica. int [] matriz = nuevo int [10];
Taylor
1
@Taylor Pero esa lista no aumentará dinámicamente. Eso es una matriz. Y supongo que OP ya lo sabría.
Rohit Jain
5

Esto no es posible. La especificación de Java prohíbe el uso de primitivas en genéricos. Sin embargo, puedes crear ArrayList<Integer>y llamar add(i)si ies un int gracias al boxeo.

nanofaradio
fuente
4

Puede utilizar colecciones primitivas disponibles en Eclipse Collections . Eclipse Collections tiene List, Set, Bagy Mappara todas las primitivas. Los elementos de las colecciones primitivas se mantienen como primitivos y no se produce ningún boxeo.

Puede inicializar una IntList como esta:

MutableIntList ints = IntLists.mutable.empty();

Puede convertir de List<Integer>a IntListasí:

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

Nota: Soy colaborador de Eclipse Collections.

Nikhil Nanivadekar
fuente
3

Las colecciones utilizan genéricos que admiten tipos de referencia o wilcards. Sin embargo, puede utilizar una Integerenvoltura

List<Integer> list = new ArrayList<>();
Reimeo
fuente
0

Cuando usa Java para el desarrollo de Android, se recomienda usarlo SparseIntArraypara evitar el autoencuadre entre inty Integer.

Puede encontrar más información SparseIntArrayen la documentación de desarrolladores de Android y una buena explicación para el autoboxing en Android ingrese la descripción del enlace aquí

Stefan Medack
fuente
Esa es una declaración fuerte. Sin duda, con SparseIntArrayfrecuencia es una mejor opción, pero hay que tener en cuenta sus ventajas y desventajas. "La implementación no está destinada a ser apropiada para estructuras de datos que pueden contener una gran cantidad de elementos. Por lo general, es más lenta que un HashMap tradicional ..."
Andy Thomas
Sí, eso es verdad. Cubren esta compensación bastante bien en el video que vinculé. Pero el OP pidió esa posibilidad en particular y solo quería agregar que en realidad es posible con Android y también se recomienda para la mayoría de los casos de uso. ¡Gracias por agregar esa información!
Stefan Medack
0

¿Hay alguna forma de convertir una matriz Integer [] en una matriz int []?

Esta gran omisión de las bibliotecas centrales de Java parece surgir en casi todos los proyectos en los que he trabajado. Y por muy conveniente que sea la biblioteca Trove, no puedo analizar los requisitos precisos para cumplir con LPGL para una aplicación de Android que vincula estáticamente una biblioteca LGPL (el preámbulo dice que está bien, el cuerpo no parece decir lo mismo). Y es simplemente un inconveniente tener que extraer y eliminar fuentes de Apache para obtener estas clases. Tiene que haber una mejor manera.

Robin Davies
fuente
-4

La colección de Java debe ser solo colecciones de objetos.

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

Integer es una clase contenedora del tipo de datos primitivo int.

¡más de las clases contenedoras de JAVA aquí !

U puede guardar directamente y obtener int hacia / desde integerList como, integerList.add(intValue); int intValue = integerList.get(i)

Selvaraj
fuente
1
La primera línea no se compilará y las dos últimas líneas de código están en todas partes. Abstente de hacer esto.
The_Martian