【Java基础】装箱、拆箱的基本操作(附面试题)

装箱、拆箱、自动装箱、自动拆箱

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值