00:00
行,那咱们说完这个证方法的一个基本情况之后啊,咱们下边呢,看一下这个面试题,那这个面试题的话呢,这个题面呢,其实非常的简单对吧,但是这道题的话呢,很多人应该是都会做错。啊,甚至有的人呢,看了答案之后呢,也解释不清楚,对吧,这个呢,就是我要给大家讲的这个比较难的这样的一个题目。啊,这个题目的话呢,其实在呃,网上的这个帖子当中啊,我也看到了很多,那基本上呢,那有解释的相对来说还可以的啊,但是绝大部分呢,解释都不清楚,那解释的还可以,这里边儿呢,我目前为止是没有看到过一个呢,解释的是极其透彻的。啊,那其实呢,也是因为这样的一个动力驱使啊,我把这个string呢,专门专门呢成了一个章节行,就是主要原因还是因为这个题目的原因啊,是这样子的行,那也相当于是一个好奇心呢,驱使着我把这个问题呢,要解释的一定要透彻,那大家看一下我这个讲解的是不是清楚,那要想讲究这个问题啊,我想呢,还得有一些储备的东西,那这个储备的东西呢,其实就引入了我们另外的一道常见的面试题。
01:01
这个题目的话呢,大家应该也见过对吧,说这个new string啊,AB说呢,会创建几个对象。啊,说为什么要跟他有关系呢?啊,只有把这个事儿,包括着这个事儿咱们说清楚以后,咱们翻回去再看刚才这道面试题呢,大家就会更容易去理解啊就像呢,你现在说我就想造火箭,那你就想造火箭的话呢,那先问一问你,你学没学过啊,物理当中的这个空气动力学啊,流体力学啊,有没有学过数学当中的这个控制论。啊,有没有接触过这个长安分方程偏微分方程啊,如果这个呢,你都没有接触过,没有学习过,那先去学习啊,然后呢,你再学习怎么去造火箭,对吧?那这也是一样,要想把上面这个问题啊彻底弄清楚啊,我觉得网上的解释当中主要呢,还差了这两个东西,那这两个东西里边所蕴含的还是我们做资金码指令,所以说很多我们关于代码的解释啊,要想能够彻底的说明白,我们还是要接触到这个自解码指令的。好,那这块呢,我问大家一个问题,说尼论到底会造几个对象?啊,那我觉得很多同学呢,这个答案呢,都是对的,说呢,哎,会造两个对象,一个呢,就是我们new对象嘛,必然会在堆空间当中,我们会拗一个就是分配一块空间来放我们这个new的对象,这是其一,就是我们这个new关键字对吧?哎,它所决定的,那另外一个呢,就是说我们在常量池里边啊,还会放一个叫AB。
02:17
啊,那很多人回答这个问题呢,我想答案呢都是对的,但如果面试官要问一下,确定是这样子的吗?你怎么证明这个情况?那我觉得呢,90%以上的人呢,又傻眼了。对吧,啊,因为呢,呃,咱们呢,去网上找很多关于这个这个的一个面试题的一个解答呢,想必都是这样写的,当然呢,你是不是真的清楚,我觉得呢,不一定。好,那咱们就来解释一下。这个解释的话呢,咱们先看这个叫,呃,这个string new这样的一个test。啊,这样个test啊,这个名字呢,好像写的有点问题是吧,稍微的改一下名。啊,多了一个二是吧,还去一下啊,哎,小事啊,这就是我们这个new string说呢,它到底造了几个对象,哎,这个思考题呢,咱们一会来说,先来看上面的问题啊,造了几个对象呢?我们说就是造了俩对象,但是你怎么这么一个事儿,看自己码。
03:08
拿着咱们下边的话呢,就来看一下这个资金码,这个资金码的话呢,其实跟我们这个JDK是哪个版本呢,其实没什么关系啊,咱们这块用的也都是这个八的版本行,那首先呢,把我们这个程序呢,先做一个编译。啊,主要呢,保证我们要生成这个叫自解码文件,对吧。那编译完以后呢,我们直接呢,在这块调一下叫接拉lab啊,我们来看一下这里边这个情况,找到我们这个没方法啊,来看一下我们这个勾,其实这个自形码你一看啊,恍然大悟就全都清楚了,首先我们去new一个string啊,一方面呢,我们涉及到堆空间当中,我们一调这个new,这个new关键字啊,就会在堆空间当中给我们开辟一块空间,然后去存放我们当前的要new的这个对象是思纯类型的。德尔。对吧,然后再次的话呢,我们说在常量池里边呢,会有一个AB,这个AB呢,就是我们这个操作。啊LDC啊,这是一个资金码指定了是吧?哎,它呢对应的这个叫AB,就是在常量池里边,由于咱们前面呢已经哎没有呢创建过这个字符串,常量池里边没有放过这个AB,所以这个呢,就是我们首次呢放进来这个AB,把它呢取出来是吧?哎,然后呢,这个在我们构造器当中呢,相当于做了一个初始化。
04:17
那然后把这个得到的整个这个对象呢,你付给我们,呃,前面呢,你放的这个itr嘛,诶这呢是放在我们这个交配唯一的位置了,就是我们这个itr,那当然呢,你可以来看一下这个局部变量表1ITR是吧,然后零的位置呢,放的是我们这个方法的一个行参。啊,写的非常清楚,那这里边儿的两个对象,就是我们这new的这个对象和我们这里边常量吃的角AB。所以呢,是俩对象没问题,但是呢,你能不能解释清楚啊,刚才呢,我给大家已经说明了。哎,当然这个题呢,你要说说的再这个完备一点呢,那就是看一下之前说你造俩对象是吧,哎,你就看之前呢,有没有在这个常量池当中声明过啊,如果要声明过的话呢,那也不算是又造了一个AB了,那就相当于是用已有的那个AB能理解这意思是吧?啊就是总之的话呢,就是重点呢,强调是两个,就是一般的前面都没有了啊,没有常量是AB呢,是两个,但是你要说清楚为什么是两个啊,这个呢,主要原因是因为啊一个对象。
05:13
那对象是我们通过这个new关键字啊,在堆空间。创建的。啊,那么另一个对象。是啊,是什么呢?就是我们,呃,底层呢,看到这个LDC啊,就是字符串常量驱动的对象啊,这个对象这个呢,我们如何去证明呢?咱们看到这个子接码指令。那这个呢叫LDC是吧,OK,这就说清楚了,那这个要说清楚以后呢,咱们接着来看下边这个操作,我把它呢处理掉,把这个呢打开。哎,然后呢,我们这时候再重新做一个偏移。嗯,可以了是吧,那这块呢,你可以直接打开这个接lab j class lab,然后这块呢,做一个刷新,诶这就可以了,行,那这个的话呢,说它到底造过几个对象呢,那他看呢,你能不能回答正确呢。
06:11
我就得悬,这个实话讲,我觉得大家悬,如果你要不看最起码文件的话呢,我觉得你很悬。好,那有几个对象呢,那我们这里来分析,首先的话呢,我们这你会看到呢,是new了一个叫string builder。哎,这个原因呢,是因为中间呢,咱们涉及到这个叫拼接操作,咱们已经有前面的储备知识了,只要呢拼接呢,前后你出现了变量,咱们一定要有string build,所以这个呢,有几个对象呢?啊首先呢,我们说第一个对象啊,这我就写这个对象一,这个对象一的话呢,就是咱们去new的这个叫build。没问题是吧?好,那我们new个stream builder,然后接下来呢,咱们去看到调这个这个构造器了,这是做这个初始化的啊,然后再接下来的话呢,我们看到这个是new string,哎,New string呢是我们第二个对象,然后呢,在字符串常量池里边还有一个小A,也就说这个结构实际上就是咱们刚才说的这个上面这个问题是不是造了俩对象啊,那这个是对象一,然后接下来这个对象二,这个对象二呢,是我们拗了一个润。
07:14
是吧,哎,牛斯顿,然后这个对象三啊这个呢是常量池,哎中的这个小黑。嗯,这是个它行,这是我们说的这两个结构,然后呢,你把这个嗯小A的话呢,是不是作为我们下边又调了一个构造器的时候,把这个A呢赋给它的是吧?这块呢,它具体也有个值嘛,那就给它付过去的行,就是一个是用的这个对象,另外一个呢,是我们常来式这个A行,这是说这俩啊,然后再接下来呢,我们去调了一个叫做open的方法,这个openend的方法呢,相当于是把咱们这个呃,New的这个对象的一个字符串呢,是不是添加到咱们这个string buffer对应底层对吧,那底层这个产生数字当中,再接下的话呢,又有这样一个操作。哎,那下边呢,是不是接着就是我们的,这叫对象四。
08:00
这个对象四呢,就是咱们去new的这个string,这个里边放的是B啊,然后后边呢,还有一个LDC啊,是一个B常量池里边啊,又帮我们放了一个是不是小啊。把它放在这行,这呢是我们看到这个场景,然后接下来呢再去调啊,这是调string构造器了啊,然后string build呢,把它这个放进去啊,这是aend,那添加进济以后呢,我们最后又调了一个叫to string方法,这个to string方法的话呢,又挺有讲究的了。To方法话呢,图顺序方法的话呢,返回的是一个字符串,这个咱们都知道对吧,就是这个题目呢,咱们要说到这个层面的话呢,实际上呢,这块算是有五个对象,但是你要在里边再展开的话呢,实际上还不止,为什么这么说呢?咱们看一下ctrl shift t啊,这呢叫string build对吧。行这个string的build啊,我们找一下当前工程啊,点开进来,然后我现在呢,就看一下它这个叫to方法。
09:03
当我们去调string build to string方法的时候呢,帮我们反馈给string啊,真的是再正常不过的了,当然这个操作里边呢,还有讲究。啊,这个里边还有讲究,我们目前看到的是不是就new了一个Lina。对吧,目前看到我们就new斯行,那咱们回过来在这呢,我们接着去记录啊,就是目前呢,从这个情况来看呢,我们主要呢,从这个面上来看,是有这样几个对象,然后我们这块呢,又是做了一个相当于一个深入啊深入这个剖析,剖析什么呢?就是咱们这个词string啊builder,它的一个叫to string方法,这个to string方法里边呢,咱们是,呃,它人家是个空参的啊啊你本身这个string builder呢,它里边是放了视角AB了,那这个里边呢,是什么情况看一下。找到我们这个stream build,咱们这块呢,看一下它的这个叫杰lab。啊,Build的点开进来找他的这个叫图方法。
10:00
看在这儿,点开看这。行很清楚对吧,好,那么这个string build,这个to string方法它是什么意思呢?你看里边呢,我们是不是用了个string呢。啊,纽克斯顿,哎,然后呢,叫的零啊零呢,就把我们这个,嗯。我们说的这个叫局物变量表里边这个零这个位置这个数据呢,给我们取出来啊,取出它的核心的这个value啊,做一个赋值,那其实我们这个问题当中就是AB呗。就是个AB啊,那我们就扭了一个string啊,AB呢其实做了一个赋值,然后最后呢,这呢相当于是做了一个return。啊,也就是说在我们这个底层看到这个new string的时候啊,深入剖析它里边呢,我们是不是又创建了一个对象啊,哎,这时候呢,我暂且这写这个叫对象六,这个对象六呢,就是我们用了一个string,这个string里边呢,是不是放了个AB。对吧?哎,这个场景好,那我问大家一下,那么此时呢,我们这样的一个操作呢,字符串常量池里边有没有AB。再说一遍,最后这常量池里边有没有AB?
11:02
我们从这来看。没有出现是不是LD cab啊。哎,也就是说字符串场景池里边不存在着AB。啊,注意我们这块强调一下。嗯,在这写强调一下这个to方法的调用。嗯,它的一个调用啊,在字符串哎,常量池动。啊,它呢,就没有,是不是生成ad啊。嗯,还是有这样的一个说明的。哎,保存一下行,那么这两个呢,大家你会发现是不是有点区别。看到这个区别了吧,就是我们刚才那是说的这些细节,现在你宏观跳出来我们这样的方式,你一个string叫AB,我们常量池里边是不是有啊。还通过这个引入的啊,这个常量尺度,这个对象对这个对象呢,是不是就是说就叫AB来用这个小写的啊。
12:03
嗯,没问题,而我们下边这个操作呢,你注意常量池里边是没有这个小写的AB的,这个非常关键。非常关键,这个呢,我说完了。哎,大家呢,你看一下是自己呢,是不是能够理解这个清楚啊,不清楚的话,你自己呢,实打实的去看一下这个词解码指令啊,也能够去理解。好,先停一下。
我来说两句