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

时间:2013-09-22 14:42:25

标签: java autoboxing

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

Integer I = 30;  // is it autoboxing?

Integer I = new Integer(30);  // I know it is autoboxing

2 个答案:

答案 0 :(得分:6)

有区别。第一个将被视为

Integer I = Integer.valueOf(30);  // autoboxing

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

你可以自己看看:

Integer I1 = 30;
Integer I2 = 30;

System.out.println(I1 == I2);
true

VS

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

System.out.println(I1 == I2);
false

一般情况下,不要将Integer个对象与==进行比较,因为它会测试引用相等性。我在这里使用它来测试I1I2是否引用同一个实例。在第一个代码段中,他们这样做是因为与Integer int对应的30已存在于缓存中,并且此实例已被使用并分配给I1和{{ 1}}。在第二个片段中,它们没有,因为我们通过I2创建了两个独立的对象。

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

通过Integer查看已编译的字节码,您实际上可以看到自动装箱的效果。

答案 1 :(得分:2)

在第一行写下

Integer I = 30;

在第一眼看,你给一个对象分配一个整数(没有显式类型后缀的所有数字文字被认为是整数),你认为编译器应该抱怨不兼容的类型。但它没有,那么这就是魔术发生的地方 - > auto boxing!编译器自动将整数30打包到对象I中,即它创建一个包含整数值30的Object并将其分配给您的引用。

在第

Integer I = new Integer(30);

您明确使用new来创建对象。所以你不要让编译器有任何机会做任何事情。实际上,确定这是auto boxing ??

的原因

除此之外,jvm还会为常量缓存一系列值,以最大限度地减少用于这些常量的内存,从而提高性能。要使用此功能,您应该使用valueOf()方法获取此类对象的实例。在这种情况下,对于相同的整数值,返回一个唯一对象。如果使用new创建它,那么对于相同的常量,每次都会得到一个不同的对象。