Puede usar la herramienta javap
para verlo usted mismo. Compilar el siguiente código:
public class AutoboxingTest
{
public static void main(String []args)
{
Integer a = 3;
int b = a;
}
}
para compilar y desmonte:
javac AutoboxingTest.java
javap -c AutoboxingTest
La salida es:
Compiled from "AutoboxingTest.java"
public class AutoboxingTest extends java.lang.Object{
public AutoboxingTest();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_3
1: invokestatic #2; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
4: astore_1
5: aload_1
6: invokevirtual #3; //Method java/lang/Integer.intValue:()I
9: istore_2
10: return
}
Por lo tanto, como se puede ver, autoboxing invoca el método estático Integer.valueOf()
, y autounboxing invoca intValue()
en el objeto dado Integer
. No hay nada más, en realidad, es solo azúcar sintáctica.
Es interesante observar que llama a valueOf (int) en lugar de nuevo entero (int) para convertir int a Integer. valueOf hace caché de objetos para los primeros 1000 o tan enteros. –
-128 a 127 están en caché –
@Craig: para ser precisos, -128 a 127 ** debe ** estar en caché, otros valores pueden ser almacenados en caché por una implementación. –