2009-08-19 16 views
20

¿Hay una clase de matriz expandible en la API de Java equivalente a la clase Vector o ArrayList que se puede usar con primitivas (int, char, double, etc.)?Java Vector o ArrayList for Primitives

Necesito una matriz rápida y ampliable para enteros y parece un desperdicio tener que envolverlos en la clase Integer para usarlos con Vector o ArrayList. Mi google-fu me está fallando.

+5

+1 por "Mi google-fu me está fallando". – kevinarpe

Respuesta

34

Desafortunadamente no existe dicha clase, al menos en la API de Java. Está el producto de terceros Primitive Collections for Java.

Es bastante peligroso usar el auto-boxing junto con las clases de colección existentes (en particular las implementaciones List). Por ejemplo:

List<Integer> l = new ArrayList<Integer>(); 
l.add(4); 

l.remove(4); //will throw ArrayIndexOutOfBoundsException 
l.remove(new Integer(4)); //what you probably intended! 

Y también es una fuente común de misteriosa NullPointerExceptions el acceso (tal vez a través de un Map):

Map<String, Integer> m = new HashMap<String, Integer>(); 
m.put("Hello", 5); 
int i = m.get("Helo Misspelt"); //will throw a NullPointerException 
+1

En otras palabras, use una de las bibliotecas de terceros o escriba la suya. ¡Gracias! :) –

+9

+ 1 para el remove (4) remove (nuevo entero (4)) ejemplo! –

+2

** Colecciones primitivas para Java ** se han marcado como eliminados en SourceForge. – Stephan

13

http://trove4j.sourceforge.net/

La biblioteca Trove ofrece alta velocidad colecciones regulares y primitivas para Java.

Tenga en cuenta que dado que Trove usa primitivas, los tipos que define no implementan las interfaces de colecciones java.util.

(LGPL)

+0

Esto es para desarrollo de software comercial. Aunque creo que estamos bien para usar el código LGPL, tendría que consultar con la gente, y en ese caso, sería más fácil simplemente escribir mi propia clase. Tomaré nota de la biblioteca para las futuras cosas de Open Source que escribo, ¡gracias! –

+0

Si LGPL está fuera de los límites, eso descarta una gran proporción de bibliotecas de código abierto. ¿Que estabas esperando? – skaffman

+0

Solo necesitaba saber si me faltaba algo en el JDK. LGPL no está fuera de los límites, pero puedo escribir mi propia clase en este caso en menos tiempo de lo que tomaría para obtener el visto bueno en la biblioteca, integrarlo y luego escribir el código usándolo. –

5

moderna Java soporta autoboxing de primitivas, por lo que se puede decir

List<Integer> lst = new ArrayList<Integer>; 
lst.add(42); 

Que al menos evita el vinagre sintáctico del nuevo Entero (42).

+3

Esto es peligroso (razones dadas a continuación) –

+0

De hecho, algunos métodos de colecciones Java están sobrecargados, y cuando se trata de autoboxing, Java puede resolver invocaciones que son _conceptualmente_ ambiguas seleccionando la opción no autoboxed en lugar de generar un error en tiempo de compilación . Conceptualmente, la razón de esto es que int e Integer son isomórficos, pero no existe una relación de subtipo entre ellos. Este tipo de relación no existe en Java sino en autoboxing (y algunos problemas esotéricos con genéricos y borrado de tipos). –

+2

nuevo Entero (42) es lo incorrecto, use Integer.valueOf (42) para el boxeo. – starblue

1

Eclipse Collections tiene ArrayLists primitivos para todos los tipos primitivos, así como conjuntos primitivos, bolsas, pilas y mapas. También hay versiones inmutables de todos los tipos de contenedores primitivos.

Nota: soy un committer para colecciones de Eclipse.