【校招VIP】[Java基础]装箱、拆箱的基本操作(附面试题)

08月09日 收藏 0 评论 0 java开发

【校招VIP】[Java基础]装箱、拆箱的基本操作(附面试题)

转载声明:文章链接: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

C 0条回复 评论

帖子还没人回复快来抢沙发