- 装箱:
- 自动将基本数据类型转换为包装器类型;
- 调用方法:Integer 的 valueOf (int) 方法
- 拆箱:
- 自动将包装器类型转换为基本数据类型。
- 调用方法:Integer 的 intValue 方法
- ==什么时候会自动拆箱?
- 包装类 “==” 运算在不遇到算术运算的情况下不会自动拆箱。即只有遇到运算符才会自动拆箱。
- 《深入理解JVM虚拟机》书中的一个测试例子及解答解析:
- ![](https://ws1.sinaimg.cn/large/b35c33e9ly1g1wrrcutypj20hg0k80ta.jpg)
- 解释说明:
- 初始化部分:所有的Integer对象全是:Integer a=Integer.valueOf(1);
- 第一行:true。不会自动拆箱,实际比较:Integer.valueOf(3)==Integer.valueOf(3)。
- 但是Integer.valueOf方法,当-128<数值<128时,实际返回的时缓存数组里的一个对象,所以这两个其实是同一个对象,所以返回true。
- 第二行:false。不会自动拆箱。和第一行的不同在于数值>128,每次都返回新对象。
- 第三行:true。会自动拆箱。实际是 int 的比较。
- 第四行:true。会先触发自动拆箱过程,再触发自动装箱过程。
- 也就是说 a+b,会先各自调用 intValue 方法(拆箱),得到了加法运算后的数值之后,便调用 Integer.valueOf 方法(装箱),再进行 equals 比较。
- 为什么会先拆箱?个人感觉,+运算符只对基本类型生效。所以需拆箱;
注:如有错误请指正。 - 为什么又装箱?因为equals方法的参数是Object类型。
注:如有错误请指正。
- 第五行:true。会自动拆箱。
- 第六行:false。过程见第四行。但是为什么结果是false?因为equals方法会先看入参的类型,只有和当前对象类型一致,才比较数值;否则,返回false。
- ![](https://ws1.sinaimg.cn/large/b35c33e9ly1g1wrrcutypj20hg0k80ta.jpg)
- 参考:
- 深入剖析 Java 中的装箱和拆箱 - Matrix 海子 - 博客园 https://www.cnblogs.com/dolphin0520/p/3780005.html
注:很深入,很全,多了解。 - java 自动装箱与拆箱? - 知乎 https://www.zhihu.com/question/28502011/answer/41084913
注:书上的答案。 - java中的 == 号判断,为什么基本数据类型就是比较内容,而对象则是比较地址? - 知乎 https://www.zhihu.com/question/29451160
- 深入剖析 Java 中的装箱和拆箱 - Matrix 海子 - 博客园 https://www.cnblogs.com/dolphin0520/p/3780005.html