我想知道这两者之间的区别:
Integer I = 30; // is it autoboxing?
Integer I = new Integer(30); // I know it is autoboxing
Run Code Online (Sandbox Code Playgroud)
它们是有区别的.第一个将被视为
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.
| 归档时间: |
|
| 查看次数: |
159 次 |
| 最近记录: |