2012-05-08 13 views
6

El siguiente código funciona perfecto y agrega 1 y 2 valores a la lista, pero ¿por qué? ¿Por qué no necesita crear objetos cortos explícitamente? por ejemplo: list.add(new Short(1));¿No es necesario crear objetos cortos explícitamente?

List<Short> list = new ArrayList(); 
list.add((short)1); 
list.add((short)2); 
System.out.println(list); 

Respuesta

13

Esto se llama autoboxing. Es una característica que convierte automáticamente primitivas a su tipo de objeto correspondiente. Está presente desde Java 1.5.

Lo contrario de autoboxing se llama autounboxing pero cuidado con NullPointerException

+1

+1 para la advertencia sobre los NPE. Para hacerlo explícito: 'list.add (null); short s = list.get (0); 'El get básicamente compilará hasta' ((Short) list.get (0)). shortValue() ', que obtendrá un' null', lo convertirá en 'Short' , y lanza un NPE en 'shortValue()'. – yshavit

1

Esto se llama autoboxing.

Tenga en cuenta que seguirá creando objetos verdaderos Short automáticamente, y estos ocupan 16 bytes en su pila, lo mismo que un objeto Entero. Solo los valores nativos short solo ocupan 2 bytes (pero no se pueden poner en java.util.collections).

En muchas situaciones

list.put((short) 12345); 
list.put((short) 12345); 

, de hecho, incluso crear dos tales objetos, es decir, 32 bytes más la memoria ocupada por el objeto de lista. Los punteros almacenados en la lista ya ocupan de 4 a 8 bytes cada uno.

Si tiene unas pocas instancias, está bien. Si tiene varios millones, esto puede afectar negativamente el rendimiento debido a la administración y uso de la memoria. Con los pantalones cortos crudos, por lo general, puede ir 10 veces más lejos antes de volverse lento o quedarse sin memoria.

+1

Yo diría que, por lo general, probablemente necesite más de "miles" para encontrarse con problemas de rendimiento significativos – Buhb

Cuestiones relacionadas