00:00
那接下来啊,咱们给大家讲一个重要的方法,叫做int方法,这个in特方法呢,也是咱们这一章的一个重头戏,一个大餐,这也是为什么呢,我想把这个string啊单独作为一张存在的一个重要的原因,就是呢,我们来讲一下这个in inter,因为呢,我们在开发当中,实际上呢,关于字符串这块啊,这个一方面呢,诶常会用in inter,另外一方面呢,很多同学呢,因为不会正确的使用int呢,导致呢,这个开发的这个效率呢,这个程序呢,执行过程当中这个效率会比较差,那同时的话呢,在笔试面试当中呢,也经常会出现这个int,所以这块呢,诶单独的我想把它来说一说,实际上呢,整个呢,讲这一章的一个目的呢,是因为in inter,讲in特的目的呢,还是因为呢,有一道面试题,这道面试题的话呢,确实是有难度的啊,很多人,包括呢,有开发经验的人,看了一道题之后呢,可能你本身也想不明白到底是怎么回事,那等一下呢,咱们就把这道面试题呢给大家讲解一下。啊,那基于一些原因吧,啊,就刚才上面提到的这些呢,咱们呢,把这个特方法呢,单独成一节,这一节呢,也是咱们这章的一个重头戏行,那首先的话呢,我们来看一下这个in的方法在这个API当中的一个介绍啊OK,首先呢,我们去找到这个string。
01:09
看一下这个源码1.8当中这个string好进来了,进来以后呢,CTRL一下,我们先找到这个int方法。行,那这个方法的话呢,首先我们看到它是一个native的方法啊,一是呢,它底层呢,调到我们这个相关的C的一个操作啊,C的这个代码,那么这块呢,咱们就没有必要来打开这个open jdk呢,去看一下它底层的一个具体C的一个调用情况啊,就没必要了,那么关于这个音频方法呢,上边呢,也有关于它的一个注解啊,注释是吧,这个文档注释,呃,咱们呢,把这个光标放到这,他也能够呈现出来,诶我们通过这样的方式呢,大家一起来学习一下,行,那这块的话呢,我们一起来读一下这里边的一个核心的逻辑。好,那。嗯,我们直接呢,通过这来看,说呢,当when the inter method isvoedvoed,啊,当这个inter方法被调用的时候,说if the poor already contains a string,说呢,当这个池子当中,就是我们说的字符串常量池已经包含了一个字符串equal to等于这个对象。
02:06
I determined by,就是当我们通过这个equals方法是吧,通过这个equal方法呢,去调用的时候呢,发现呢,这个当前的这个对象,这个字符串和我们这个呃,已有的这个对象呢,它俩是E的。就是是相等的时候啊,就是常量池里边已经存在这个对象,跟你当前呢,是不是要呃判断的这个对象是吧,他俩如果要是,哎,这个用E后的方法比较是相等的话呢,我们认为它俩呢就是相等的。那接下来的话呢,我们这个string从这个池子当中的这个string呢,将要被返回,也就是说呢,我们没有必要呢,是不是再去池子当中去创建一个这个同样的字符串了,就把这个已有的这个字符串呢返回就行,Otherwise啊说否则的话呢,这个字符串对象呢,将被添加到咱们这个池子当中。那就是当你这个equals返回的不是处的时候,是吧,我们就把它添加到这个池子里边,那然后呢,把你添加的这个对象呢,它的一个reference引用了返回。
03:03
啊,这个说完以后呢,大家能不能听懂这个逻辑呢?哎是这个意思,这呢是咱们说的这个字符串常量池,不管呢,你是在GP6瓦七啊8A也好,不管你是什么版本中,这呢就是字串常量池,那说这个常量池里边,比如说啊,我这里里边有一个叫C,说现在的话呢,哎,你想呢,这个也往这个池子里边放一个ABC。影响往池子里边放个ABC,那这时候呢,你想放在这是一个字符串,我这已经有个字符串了,发现他俩呢,按照这个ECO的方法呢,比较的时候呢,返回是触,那这时候呢,你就不要往池子里边再放了,就把你这个ABC的地址呢,返回给你这个S就行。对吧,就好比是我们这个声明S1是一个ABC,然后呢,大家呢又声明了一个变量,S2呢也叫ABC,那很显然呢,一开始第一次没有的时候呢,把它呢创建里边,然后S2呢也是这样呢,去直接自变量的方式赋值的时候,它呢就没有必要再去创建一个了,这呢针对的是咱们这other otherwise之前的情况,那后边呢是说说如果你这个池里边没有,那比如说我现在又订了一个S3,这呢我叫做hello。
04:03
那此时呢,咱们这个常量池里边就没有这个哈这个字串,或者说呢,已有的这个字串呢,跟他去比的时候呢,是不是全都不是触,那我们就把这个哈呢,放到咱们这个常量池当中,然后接下来呢,你这个S3呢,就指向了你这个常量池里边这个哈的这个引用地址。就是咱们这里边逻辑也IG呢,就保证我们这个常量池当中按照ECO方法呢,返回这个触的情况呢,是不是不可能存在对吧,所有的这个字符串常量池里边大家用E库判断呢,全都是false。全都是false,咱们呢,是不是也提到过说那个哈table的问题对吧?行,那接着我们再往下看。嗯,行,接着再往下看,说这说it follows that啊,这是个从句,说for any two strengths,就是两个字符串,一个叫S,一个叫T,说s.ENT等等于T点啊,Is true,说这是个true if and only if,说s equals t,它也是true。这个if and only if这个呢,不知道大家有没有接触过啊,他呢是数学上的一种描述,表示的就是当且紧张的意思啊,这个对于我来说应该是非常的熟悉,我们上大学的时候呢,学的呃应用数学嘛,应用数学呃,具体的方向的话呢,我属于这个叫呃统计方向啊,统计方向我们学的最基础的课程呢,叫概率论与数理统计啊,当然这个我们学校号称是全国也是排前四的啊,这个概论数理统计是数学学院的,这个讲解的就相对深入一些啊,我们用的教材呢,说要对标这个国际一流名校,所以我们用的教材也都是纯英文的哈啊,当时呢,大一时候就开始学纯英文的这个数学教材,还是非常痛苦的,当时呢对这个也是印象非常深刻啊,If and only if在数据当中呢,这个等价于的情况呢,是非常多的啊,就是这个意思。
05:42
这要想描述的什么呢?就是说S的int方法和t.in特方法,如果你这个是处的前这个,这个等价于呢,就是这个,这个呢大家非常的熟悉,不陌生啊,S跟T呢,我们是ES的,说明呢,就不管你是什么样的方式造的字符串对象,它本质上底层的那个叉形数组,一个位置上一个位置上的那个差,它俩是一样的,对吧。
06:03
啊,比如说我们这有一个ABC,不管你是new的还是说直接声明的啊,跟另外一个ABC啊,你有可能是new的方式对吧,那这两个呢,如果是ES的话呢,我们各自去它们常量池里边去找的话呢,啊,那么它俩呢,也都是相等的。就是当我们去调用这个的方法的时候呢,咱们就是去这个常量池里边啊,去找一下你这个对应的这个字串,那个实体的值在不在,如果不在的就造一下,并返回那个地址。那你要是在呢,在呢就直接返回是吧,哎,这两个是完全一个意思,大家体会一下,以前呢,可能没有这样的一个想法是吧?哎,这个写的是对的啊,然后下边呢,说所有的这个字面量的这个字误串,或者呢是诶把这个string呢,作为它核心值的这样的一个常量表达式,他们呢,诶都可以使用咱们这个。啊,印证这个方法,然后接着。嗯,这个一整它就没有了啊,接着说这个string的这个字变量啊,它被定义在我们这个三点十点五,呃,Java的这个语言的这个规范当中啊,这个呢,咱们是不是前面给大家提到过。
07:03
就是呢,咱直接诶看一下这个语言的规范。咱们是带大那会儿呢,读过对吧,找到我们这个版本。然后在这里边呢,就是提到我们这个string的这个自变量的问题,行啊这呢咱们就不细看了,诶这个上面呢,其实给我们介绍一些非常多的详细信息啊,当然呢,这块也是比较权威的对吧?行,那下边我们来看一下这样的一段描述,说如果不是用双引号声明的这个string对象,也就是说你不是用这种自变量的方式,可以呢,使用string提供的int方法,冒号说呢,Int方法呢,会从字符串常量池中查询当前的字符串呢是否存在,若不存在呢,就会将当前字符串呢放入常量池当中。就是这个in inter方法它的一个主要作用,比如说我们这块呢,是一个new的方式呢,造了个对象,那这个时候的话呢,我们new的这个对象,它的核心内容呢,就是I love还在硅谷,然后呢,就会调in inter方法的时候,判断常远池里边有没有这个I love at硅谷啊就是一说的话是这样子的,这呢是我们这个堆空间,那咱们就以八的版本为例,常量池呢就是在这里边了,首先呢,我们用一个string,那就是我们在这个位置呢,用了一个string。
08:07
那它里边呢,就I love硅谷是吧,然后呢,说我们调完它以后呢,调一特方法就会在常量池里边去找I love I的硅谷存不存在,如果要不存在呢,我们就把它扭一下。把它创建一下,创建完以后呢,把这个地址给了谁呢?给了咱们前面声明的叫my infer啊,你可能是在一个方法当中,那这就是一个战争里边的局部变量表里边的一个信息。对吧,那就给了他了,行,就是说的这个意思,那如果说你要是存在呢,存在也就把你存在的这个对象的第一帧呢,返回给他,不就是咱们刚才看到这里边一开始描述的上面那段话吗。对吧?是这意思行,也就是说呢,如果在任意字符串上调用这个因子,方法呢,返回结果呢,指向的那个类实例必须呢,和直接以常量形式生命的这个字符串的实例呢,是完全相同的,比如说这俩呢,是一个意思。哎,是一个意思,嗯嗯,就是intend的string确保呢常量池,呃,这个字符串呢,在内存中只有一份,这个内存呢,主要就指的咱们说的字符串常量池。
09:05
那其实说到这儿的话呢,其实是有这样的一个情况的,咱们呢,就比如说把这个打开,咱在上面这块稍微的描述一下。嗯,说呢,诶如何。哎,保证咱们这样说吧,如果保证这个变量,嗯,S说指向的是字符串常量池,哎,中的这个,呃,数据呢。哎,我们说呢,有两种方式,那我就直接呢,在下边给大家举例,那第一种方式的话呢,就是我们直接呢,使用这种自灭量自变量这个生命的这个方式。比如说我这个磁针形的这个S呢,我直接呢就叫做hello没问题是吧,我这换一个,比如叫嗯它是吧,这个呢,就是我习惯上用这个来表示是我的这个符号了啊,诶这呢是我的邮箱,当然呢,如果有任何学习上的问题呢,你也可以给我发邮件啊,这个我可能不会及时的每天都回啊,当然呢,一般隔段时间呢,也会看一看这个邮件的,像这是一种方式,那这个时候呢,我们这个使用这种叫自变量的方式。
10:16
此时的话呢,诶,此时的话呢,咱们这个字符串呢,就是在常量池当中,那返回的这个就是常量池里边这个字符串的一个地址给了这个S了,嗯,是他是吧,然后还有一种方式,方式二的话呢,就是不管你前边这块是怎么着做的,哪怕呢,比如说咱们是这个new一个string啊,或者说这个怎么着都行,New个string,我里边写的是这样的一个字符串是吧?第二我们第二个这个in方法,这是一种情况,或者的话呢,哎,这再接着写。你这有一个比如说。那string build里边呢,你写上这个这样一个字符串,对吧,写这样字符串呢,String build你可以调这个叫a two string方法,方法完了以后呢,我们再去调这in inter,呃,总之啊,就是不管你前面是怎么能够,呃想尽各种各样的办法你造,或者你调一个你程序当中的一个方法,反回是个字符串等等啊各种各样的形式,最终呢,就是只要你去调一下我们这个int方法,我们呢,都是去字符串常量池里边帮你去找你前面这个字符串那个实际上实体上那个呃,双引号里边那个东西啊,在常量池里边那个结构。
11:25
啊,关键呢,我们方式二呢,就是一定要去调这个验证方法啊,这个是咱们要强调的这点。嗯,这呢,我们写为啊叫调用。诶in特方法行,那我们先把这个特呢一个基本的一个说明啊,现在给大家说清楚。
我来说两句