Autoboxing - 这两条线之间的差异?

Mar*_*adi 3 java autoboxing

我想知道这两者之间的区别:

Integer I = 30;  // is it autoboxing?

Integer I = new Integer(30);  // I know it is autoboxing
Run Code Online (Sandbox Code Playgroud)

ars*_*jii 6

它们是有区别的.第一个将被视为

Integer I = Integer.valueOf(30);  // autoboxing
Run Code Online (Sandbox Code Playgroud)

它将使用Integer已存储在内部缓存中的对象(当自动装箱范围为-127到128(包括端点)时,这是正确的).第二个将显式创建一个新 Integer对象.

你可以自己看看:

Integer I1 = 30;
Integer I2 = 30;

System.out.println(I1 == I2);
Run Code Online (Sandbox Code Playgroud)
true

VS

Integer I1 = new Integer(30);
Integer I2 = new Integer(30);

System.out.println(I1 == I2);
Run Code Online (Sandbox Code Playgroud)
false

通常不要比较Integer对象,==因为它测试参考相等性.我在这里使用它来测试是否I1并I2引用同一个实例.在第一个片段中,他们这样做是因为Integer对应于int 30已存在于缓存中,并且此实例被使用并分配给两者I1和I2.在第二个片段中,它们不会,因为我们通过创建两个独立的对象new.

顺便说一下,在第二种情况下没有涉及自动装箱,你只是创建一个简单的新对象.在第一种情况下存在自动装箱,因为a int被隐式转换为Integer.

通过查看编译的字节码,您实际上可以看到自动装箱的效果javap -c MyClass.