最近面试也遇到了这个问题,思考总结了一下。
装箱:在基本类型的值赋值给包装类型时触发。例如: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,是缓存中同一个对象
欢迎修改补充...
装箱就是把基础类型封装成一个类。比如把int封装成Integer,这时你就不能把他当成一个数了,而是一个类了,对他的操作就需要用它的方法了。拆箱就是把类转换成基础类型。比如你算个加法什么的是不能用类的,就得把它转换成基本类型,jdk5以后已经可以自动转换了貌似。基本类型你应该懂的吧,就那八种