100天面试第八天——Java自动装箱和自动拆箱源码分析
Posted 100天面试
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了100天面试第八天——Java自动装箱和自动拆箱源码分析相关的知识,希望对你有一定的参考价值。
100天面试任意门
更多请点击最下方“阅读原文”
分享一些最近比较关注的知识
原文请见链接
侵权告知速删
自动装箱(boxing)和自动拆箱(unboxing)
首先了解下Java的四类八种基本数据类型
自动装箱
Java中所谓的装箱通俗点就是:八种基本数据类型在某些条件下使用时,会自动变为对应的包装器类型。
如下清单1:
输出:
1 2 |
true false |
解释下清单1第11句输出true的原因:
当包装器类型进行“==”比较时,i3会调用Integer.valueOf自动装箱基本数据类型为包装器类型。
从源码中可以看出,Integer对象自动缓存int值范围在low~high(-128~127),如果超出这个范围则会自动装箱为包装类。
这个是不一定的,要看具体的值是多少,所以这时候考官问我们这个问题我们应该答不清楚
Note:
Integer、Short、Byte、Character、Long这几个包装类的valueOf方法的实现是类似的;
Double、Float的valueOf方法的实现是类似的。
Boolean的valueOf方法的实现是个三目运算,形如 return (b ? TRUE : FALSE); `
自动拆箱
Java中所谓的拆箱通俗点就是:八种包装器类型在某些条件下使用时,会自动变为对应的基本数据类型。
清单2:
输出:
1 2 |
true true |
解释下清单2第10句输出true的原因:
当程序执行到第10句时,i4会调用Integer.intValue方法自动拆箱包装器类型为基本数据类型。
从源码可以看出,当包装器类型和基本数据类型进行“==”比较时,包装器类型会自动拆箱为基本数据类型。
清单3内容如下:
输出:
1 2 3 4 |
true false true true |
解释第15句为什么会输出true:
因为在Integer包装类实现的equals方法中,只要比较的当前对象是Integer实例,那么就会自动拆箱为基本数据类型。从以下Integer类的equals方法的源码就可看出:
Note:
Integer、Short、Byte、Character、Long这几个包装类的intValue方法的实现是类似的;
Double、Float的intValue方法的实现是类似的。
Boolean的booleanValue方法的实现和intValue方法的实现也是类似的。
装箱拆箱综合清单:
输出:
1 2 3 4 5 6 7 |
true false true true true false true |
这里面需要注意的是:当 “==”运算符的两个操作数都是包装器类型的引用,则是比较指向的是否是同一个对象,而如果其中有一个操作数是表达式(即包含算术运算)则比较的是数值(即会触发自动拆箱的过程)另外,对于包装器类型,equals方法并不会进行类型转换。
原文链接:
http://www.importnew.com/16612.html
100天面试任意门
更多请点击最下方“阅读原文”
以上是关于100天面试第八天——Java自动装箱和自动拆箱源码分析的主要内容,如果未能解决你的问题,请参考以下文章