java什么时候触发装箱和拆箱

2025-04-13 09:13:50
推荐回答(2个)
回答1:

最近面试也遇到了这个问题,思考总结了一下。

装箱:在基本类型的值赋值给包装类型时触发。例如:Integer a = 1;

这时二进制文件中实际上是Integer a = Integer.valueOf(1);

拆箱:

1. 在包装类型赋值给基本类型时触发。

例如:Integer a = 1;  // a 是Integer类型

int b = a;  // 将Integer类型赋值给int类型,触发拆箱

2.在做运算符运算时触发。

例如:

Integer a = 1; 

Integer b = 2; 

System.out.print(a * b); //这时a*b在二进制文件中被编译成a.intValue() * b.intValue();

注意点:

  1. ==运算时,如果 a 和 b 都是Integer类型,则不会拆箱,因为==也可以直接比较对象,表示a和b是否指向同一对象地址。因此这里并不是比较值是否相等了。而如果a 和 b 中有一个是int类型,另一个是Integer 类型,则会触发拆箱,然后对两个int值进行比较。

  2. Integer a = 128;

    Integer b = 128;

    Integer c = 127;

    Integer d = 127;

    System.out.print(a == b); // 返回false

    System.out.print(c == d); // 返回true

    原因是Integer 的装箱(Integer.valueOf())方法会自动缓存-128~127之间的值,多次装箱同一个值实际上用的是同一个对象,因此这里 a == b 是false,因为不是同一个对象,而 c==d 是true,因为使用缓存中的同一个对象,而不是因为值相等。

    Integer a = 127;

    Integer e = new Integer(127);

    Integer f  = Integer.intValue(127); 

    System.out.println(a == e); // 返回false,不是同一个对象

    System.out.println(a == f); // 返回true,是缓存中同一个对象

    欢迎修改补充...

回答2:

装箱拆箱其实java本身就直接照基础语法来的
但现在各种框架默认调用的就是get set方法
比如springMVC 前台传后台 后台用对象来接的时候默认调用的是set方法