00:00
同学们大家早上好,今天我们来聊第七道面试题,据说啊,这道题目很多人答错了啊,所以呢,今天我们来看一看你能不能把它答对了,来看一眼,首先的话呢,是这样啊,咱们来看看,首先在这里面的话考的是什么呢?考的是这个inte这个包装类,还有呢,Int这个基本数据类型,两者的一个关系,首先我们来看一下,这里面我们先定好了一个in体格的对象I1,然后呢扭一下,然后呢再来一个in体格的对象I2,扭一下。好,请问第一个结果啊,这个比较简单,I1等于I2吗?答案是true还是false啊,你可以答到屏幕上,好,我们再来看一下第二道题啊,第二道题第二个的话呢,是I3等于66 I4等于66,然后呢,I55 I5等于66,好,那么首先前两个呢,依然是这个包装类啊,那我们看到I3跟I4它是否相等呢?这个答案是true还是boss呢?OK,可以打到屏幕上啊,然后再往后看的话呢,I5I3跟I5的话呢,它会相等呢。他会是醋还是boss呢,哎?我相信啊,这到这个地方的话,大家会比较明朗的个答案,这个地方大家可能稍微犹豫一下,而这个呢,也会犹豫一下,好,那我们再往下看,下面大家看到这一段其实跟上面那段几乎是一模一样的啊,这两段几乎是一模一样的,唯一的区别是什么呢?唯一的区别就是这个值不同,这个是66,这个是128。
01:20
啊,要把。好,那么这个地方的话,II6跟I7是true还是false呢。那么这个就是出来Bo呢?好,这道题啊,你需要达到两个效果,第一你的答案得对是吧,答案得答对了,第二你得清晰的告诉面试官为什么是这么一个结果,好,那下面的话我们先来做第一个环节,就是揭晓答案,来跟着我来看一下啊,我们来揭晓答案,然后再来解释为什么来走一个。看一下你的答案对不对?走。好,我们看一眼,把这个放大一些。好,大家应该能看到了啊,大家看到这里面的话呢,我们此刻啊,在这里面第一个结果是false,好,这个比较简单,为什么呢?因为啊,咱们这里面的话呢,做了一个new是不是我们知道但凡你做了new,那就是创建一块新的空间,所以此刻的话呢,两个都是new了,所以都是两块新的空间,那答案自然是force,这个啊答案不对就不可原谅了哈,OK,然后再往下看第二个啊,第二个的话呢,是这边写了一个66,这边写了一个66对不对,哎,然后的话呢,这个结果大家看到是true,诶为什么呢?是这样啊,注意他们俩虽然都是引用类型,但是呢,这个inte啊,它实际上来说内部呢,会作为一批数据的缓存。
02:31
这个缓存的范围是多少呢?是负的128到正的127,所以刚好这个66就在这个范围内,所以呢,相当是什么?如果在这个范围内,它就不会去创建新的对象,那意味着什么?意味着这个结果就都是同一块内存,就是true,那一会呢,我会再带你来看一下源码,来验证我这个的说法啊好,咱们接着往下走,下一个的话呢,你会看到啊,这个I3跟I5的这块的比较,I3I5的话呢,很简单,因为这个时候是这样啊,因为当我们的引用类型跟这个基本数据类型做比较的时候,实际上会发生什么事呢?咱们知道会有个自动装箱拆箱的操作,此刻它会做一个拆箱的操作,会把这个东西呢做一个拆箱,那么拆箱之后呢,它俩比较的东西呢,就是数值,只要数值相等,那么这个结果就是处,所以大家可以看到第三个答案是处。
03:25
OK啊好,那么再往后看的话呢,咱们来看一下这个128啊,大家看到这个结果的话呢,答案是什么?答案是false,为什么呢?因为刚刚我说过啊,这个东西的话呢,它有个范围的啊,128刚好超过了我们那个负的128到正的127,它刚好超过这个范围了,所以他就必须得干嘛呢?必须两者都得去拗一个新对象出来。OK,一会来看源码验证我这个说法啊,好,所以这里面的话呢,这东西现在都new了,都new了自然而然他们就会变成一个什么呢?变成一个bos啊好,再回到最后一道,最后这一道的话是这样的啊,最后这一道的话是这样,在这里面的话呢,这个I6I8啊大注意看啊I6I8,因为呢很简单,道理跟刚才一样啊,这个东西做拆箱,拆完箱之后呢,依然比较的是数值,所以呢两者都会相等,所以这个结果呢,就是处OK,最后一个是true,好,那么你猜对了吧,OK,就是你有没有答对啊,如果答对的话,恭喜你啊,那好,下面的话呢,我们来揭晓一下这个谜底,是这样子的啊,实质上啊,在这里面的话呢,我们首先new这个东西,不用毋庸置疑了,New肯定是开辟一个新的空间,对吧,那不new的话什么意思呢?是因为是这样的啊,你看这个是一个引用类型是吧?这个是引用类型,然后这个是基本数据类型,所以怎么把一个基本数据类型赋给一个引用类型呢?所以这里面隐含着什么操作呢?
04:46
这里隐含的操作就是什么?就是一个装箱操作,把这个66的基本数据类型变成一个引用类型,所以大家可以看到后面有这行代码来看一眼啊,这行代码的话呢,我们把它比如说改成六六吧,都都OK的啊,都OK的,就是实实上来说呢,变成这个样子啊这个样子,所以这个时候的话呢,实际上来说这个66它就会把它放过来。
05:07
就是他会做这么一个动作啊好,那这个时候的话,这个动作背后什么道理呢?我们来看一眼啊,点过来。好吧,放大一些。同学们可以看到在这里面的话呢,会有个什么,这个I大于等于这个inte catch.log I小于等于inte.hi诶,你看这是不是刚才我说的那个范围啊,如果说符合这个范围,那么他要干嘛,他要return return什么从一个cash。这个地方有个是个数组,发一个数组的元素意味着什么,这边缓存一堆数据。啊,换成一堆数据,如果在这个范围就直接返回就完事了,但是如果不在这个范围呢,它就会走这个new intake,看懂意思吧,诶,所以很简单,我们来看一眼啊,咱们点个断点给他调试看一眼啊断点调试来,我们在这一头,我们打这个东西啊,这个东西我们可以看一下。对吧,然后呢,我们来看下这个效果,然后呢,这个128我们也看一个效果啊,来走一个。
06:05
好,大家看此刻的话呢,我们现在先进来啊,那进来之后呢,这个地方的话呢,诶,这个地方II是从哪来的,爱是这个255哦,这个应该是前面第一次啊,第一次我们先过掉它啊,先过掉它好从这里来啊,从这里来好大家看这里面啊,这里面我们先进来啊,先进来。我们现在进到里面去啊,然后这边我们再打到连来,再打到脸,好,那现在的话我们进来看一下啊,大家看到16~66的时候,它符合什么情况呢?大家可以看到这个漏,大家看负的幺八看这高。127看到没有符合这个范围,说他会干嘛,他会进到这个cash OK,然后就OK了,就还回来了,对不对,好,这是这一步啊,然后接着往下走啊,那后面还有个66,我们把这个段先去掉啊,先去掉,然后再回来,好128呢,来注意看128,我们现在回来再打断点啊。好,来,看一眼,我们再进来。好,你会注意看啊,你看这个时候118它不在这个范围,他要干嘛呢?他要new,哎,他要new,所以啊,这个时候就会变成一个new的新的对象了,所以它就是一个什么,就是一个force式,第二次幺八依然是这个结果,依然是会再来做到这个new啊。
07:11
好OK好,后面不不走了哈,后面不走了,关掉关掉关掉它啊。好,这个调试的代码大家可以回头自己再调一下,所以大家可以刚才可以看到啊,在此刻啊,在此刻这里面的话就是这么一个结果了啊,就是这么一个结果,OK,你可以打断点调试一下,好最后呢,我们来看一下这个文档里面,我都给你做了说明啊,那么你可以再看一下文档这块东西,那么我们这块的源码呢,都是从刚才那个地方过来的啊。好,如果你感觉对你有帮助啊,那么大家可以点个赞啊,咱们下节课再给大家奉献更多的面试题啊,这节课呢,我们聊到这,大家可以多多点赞啊。
我来说两句