最近面试也遇到了这个问题,思考总结了一下。
装箱:在基本类型的值赋值给包装类型时触发。例如: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();
注意点:
==运算时,如果 a 和 b 都是Integer类型,则不会拆箱,因为==也可以直接比较对象,表示a和b是否指向同一对象地址。因此这里并不是比较值是否相等了。而如果a 和 b 中有一个是int类型,另一个是Integer 类型,则会触发拆箱,然后对两个int值进行比较。
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,是缓存中同一个对象
欢迎修改补充...
装箱拆箱其实java本身就直接照基础语法来的
但现在各种框架默认调用的就是get set方法
比如springMVC 前台传后台 后台用对象来接的时候默认调用的是set方法