转载声明:文章链接:https://blog.csdn.net/weixin_42193813/article/details/107719769
装箱、拆箱、自动装箱、自动拆箱
public class IntegerTest {
public static void main(String[] args) {
// 装箱
int num1 = 12;
Integer integer1 = new Integer(num1);
// 拆箱
num1 = integer1.intValue();
// 自动装箱
integer1 = num1;
// 自动拆箱
num1 = integer1;
}
}
面试题
第一题
Integer integer2 = new Integer(100);
Integer integer3 = new Integer(100);
System.out.println(integer2 == integer3); // false
因为两个都是new出来的对象,所以引用一定不同,结果为false
第二题
Integer integer4 = Integer.valueOf(100);
Integer integer5 = Integer.valueOf(100);
System.out.println(integer4 == integer5); // true
两个都是调用了valueOf方法
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
从valueOf方法的源码可以看到,当传入的值在缓存区的范围内,就会直接在缓存区取值,只有当传入的数值不在缓存区范围内,才会去new一个新的对象
static final int low = -128;
static final int high;
...
int h = 127;
...
high = h;
从源码中可以看到,缓存区的范围是-128到127之间,100在缓存区内,所以直接在缓存区中取值,两个对象的引用是同一个,所以结果为true
第三题
Integer integer6 = 100;
Integer integer7 = 100;
System.out.println(integer6 == integer7); // true
100是基本数据类型,赋值给包装类型,所以执行了自动装箱操作,自动装箱的操作就是调用的valueOf方法,而且数值在缓存区范围内,所以在缓存区内取数据,和上面的题一样,结果为true
反编译查看
Integer integer6 = Integer.valueOf(100);
Integer integer7 = Integer.valueOf(100);
System.out.println(integer6 == integer7);
可以看到进行了自动装箱操作,调用了valueOf方法
第四题
Integer integer8 = 200;
Integer integer9 = 200;
System.out.println(integer8 == integer9); // false
200是基本数据类型,赋值给包装类型,所以执行了自动装箱操作,自动装箱的操作就是调用的valueOf方法,但是200不在缓存区范围内,所以需要去new一个对象,两者的引用自然不同,结果为false
帖子还没人回复快来抢沙发