2011-08-19 20 views

Respuesta

12

Las pocas primeras frases del artículo publicado describen bastante bien:

No se puede poner un int (u otro valor primitivo) en una colección. Las colecciones solo pueden contener referencias a objetos, por lo que debe insertar valores primitivos en la clase contenedora apropiada (que es Integer en el caso de int). Cuando quitas el objeto de la colección, obtienes el entero que ingresas; si necesita un int, debe desagrupar el entero utilizando el método intValue. Todo este boxeo y unboxing es un dolor, y desordena su código. La característica de autoboxing y unboxing automatiza el proceso, eliminando el dolor y el desorden.

Eso es básicamente en pocas palabras. Le permite aprovechar el Marco de colecciones para primativos sin tener que hacer el trabajo usted mismo.

La principal desventaja es que confunde a los nuevos programadores y puede dar lugar a un código confuso o confuso si no se entiende y se usa correctamente.

8

Java soporta autoboxing y automáticamente envuelve valores primitivos en objetos y desenvuelve objetos a los valores primitivos para ciertos tipos, como char - Character, int - Integer , double - Double, etc.

Nota de Oracle Documentation:

Entonces, ¿cuándo debería usar el autoboxing y el desempaquetado? Úselos solo cuando haya una "falta de coincidencia de impedancia" entre los tipos de referencia y las primitivas, por ejemplo, cuando tenga que poner valores numéricos en una colección. No es apropiado usar autoboxing y unboxing para computación científica u otro código numérico sensible al rendimiento. Un entero no es un sustituto de un int; el autoboxing y unboxing borran la distinción entre tipos primitivos y tipos de referencia, pero no lo eliminan.

0

Además de otras respuestas, porque Integer es una clase contenedora, que le permite agrupar y unbox un valor de int. Otra información here.

1

El uso de un int y un Integer "indistintamente" se llama autoboxing. Esta característica se introdujo en Java 5. Antes de eso, su código de ejemplo no se habría compilado.En su lugar, usted tendría que escribir algo como esto:

Integer b = Integer.valueOf(42); // or new Integer(42); 
int a = b.intValue(); 

o

int d = 12; 
Integer c = Integer.valueOf(d); // or new Integer(d); 

que es bastante detallado, por lo que se introdujo autoboxing. Es un poco de magia compilador para hacer la vida más fácil para el codificador.

Técnicamente, int y Integer no son intercambiables y no se puede usar uno donde se requiere el otro. Sin embargo, el autoboxing permite la conversión implícita entre los dos.

Como nota al margen, hay un caso en el que falla el autoboxing (específicamente unboxing). Si el código intenta autounbox un valor nulo, se obtiene un NullPointerException en tiempo de ejecución, por ejemplo .:

Integer b = null; 
int a = b; // NullPointerException here! 

Sólo es algo a tener en cuenta ...

Cuestiones relacionadas