包装类面试题--java进阶day05
1.面试题
如下两个输出,请问分别是true还是false呢?

答案:

当范围在-128~127时,对象相同就会返回true

在讲解这个问题之前,先了解自动装箱的原理
2.自动装箱的原理
自动装箱,就是系统自动帮我们调用了valueof这个方法,虽然我们只是单纯的赋值,但在系统中依旧会调用该方法

因此,我们要了解valueOf里面究竟干了什么 如图

先不管走了什么逻辑,我们先搞清楚第一个if里面的范围是多大
ctrl 右键点击low,进入low内部
发现low是-128

然后再点击high
虽然没有直接赋值,但是往后看发现h是127,刚好给high赋值

所以第一个if的范围就是-128~127
valueOf内部分析
如果传入的数是在-128~127之间,就会走一个逻辑,否则就会new一个新的地址
i3和i4都是129,超出了范围,所以i3和i4都会各自new一个空间,对应的地址当然不同,所以返回的结果是false

当数据结果在-128~127之间

我们先把后面一大串东西拿掉,仔细观察前面的代码
会发现cache[]形态酷似数组

而后面那一大串就是它的索引,我们点击其内部进行观察,发现cache就是数组

所以,当范围在-128~127时,就不会创建新的对象,而是通过cache数组取出数组里的一个数
当i是127时,满足范围,索引为127-(-128)=255
i1和i2都是127,所以取出的都是同一份数据,所以==相比肯定是true

在cache中存在一个大小为256的数组,127+128=255,还有一个0

该设计就是用来节省内存消耗,-128~127这些数用的多,所以索性写了一个数组,方便拿取,节省内存
如果只想比内容,就可以用今天学的equals方法
很明显,Long这个包装类重写过equals方法

.


浙公网安备 33010602011771号