我想知道这两者之间的区别:
Integer I = 30; // is it autoboxing?
Integer I = new Integer(30); // I know it is autoboxing
答案 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
个对象与==
进行比较,因为它会测试引用相等性。我在这里使用它来测试I1
和I2
是否引用同一个实例。在第一个代码段中,他们这样做是因为与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
创建它,那么对于相同的常量,每次都会得到一个不同的对象。