00:00
下边咱们来看一下叫string的基本操作,这里边的话呢,实际上就是两个题目,通过这两个题目的话呢,咱们来说明一下前边的一些问题啊,比如说第一个呢,我们提到了说这个通过字符串字面量的这个方式,咱们呢,声明的一个字符串啊,它的数据呢,是存无差存储在这个字符串常量池当中的,而且呢,前面咱们也明确了说这个字符串常量池当中,哎,它是不允许存放是不是叫相同的这个内容的字符串的,对吧?那既然如此的话呢,我们看一下从实际的这个代码角度来考虑啊,是不是这么回事儿,诶这个呢,咱们写了一道题目,那另外一个的话呢,就是咱们平时在开发当中呢,这个经常呢会使用字符串的一个场景,那这呢,我们也举了个例子,诶,这就是我们说的基本的两个操作行,那首先的话呢,咱们来看这个第一个问题,哎,把这个我们都关一下。那先来看一下我们这个string test4这块,好,这呢就是提前写好的一个代码,这个代码呢,也相对来说比较简单一些啊,大家看一下,嗯,我呢,这是一个空的这样一个字符串啊,然后下边的话呢,是一二三四五六七八九十,然后呢,又把这个一二三五六七八九十写了一遍,那么按正常来讲呢,我们这个一这算一个字符串自变量了,在我们常量池当中,一旦生成以后呢,哎,一直到十,在没有的前提下呢,都会生成一遍,对吧?那么你后边呢,再出现的一到十,那其实呢,就不会再去我们自12常量池里边重新的生成一遍了。
01:23
那我们来证明一下,看看是不是如此,就这样一个道理,行,那这块呢,我打几个断点,对应的我打几个断点。啊,到这OK行,那打完以后的话呢,我们直接呢,进行一个debug的操作。行过来了是吧,过来以后的话呢,大家就直接呢,来看我们这个debug的这个界面啊,有的同学呢,可能默认打开的时候呢,没有这个memory,你在这点击一下啊,它这边就有这个memory是吧?正常呢,可能是这样子的哈,点一下这memory呢就可以了,查看一下我们这个内存的一个情况,那首先的话呢,这个断点呢,就执行到我们这个c out这诶这块的话呢,我们加载一下当前那个类啊,能够看到在我们这行代码执行这个当前,呃,其实这个当前呢,是把之前的代码都执行了对吧?这个debug大家都清楚,当前的话呢,我们这里边儿是有2293个字符串。
02:13
2293个字符串啊,就有2000多个啊,大家可能说哇,这一上来呢,就有2000多个嘛,那是这样子的,那如果你想感兴趣看一下这2000多个字符串分别是什么的话呢,你就双击一下诶,这就能看到了。啊是就这些OK,这呢咱们不多说好,那接下来呢,我们再做一个叫sta war,执行到我们下一行代码,执行到下一行的话呢,实际上是把上一行这块就执行了哈,那此时我们再去加载,发现当前是2294加了一个啊,多了一个,这是2294,那大家可能会想说上一行这到底是多了一个什么,咱们这儿呢,是不是有一个叫换行的操作呀。哎,这有一个换行的一个操作啊,实际上也涉及到他这一个问题,行,那么再往下的话呢,我要是再执行一次这个step over到这儿了,大家其实也能猜出来,那就是2295了,这个呢,其实针对于我们上一个是不是有一个一这样的一个字母串。
03:06
没问题是吧,哎,我这就不写了啊,然后呢,我们直接呢,就这个蹦到我们的这块到十这块了,到十这块呢,一加载我们此时是2303。2303,诶2303,然后我们再进行进一个step到这,这是2304。平四好这块呢,是比较有这个具体意义的,那那这2304呢,实际上指的是它之前的这块,我们一共有多少个字符串,一共是2304个,那么在这个情况之下呢,我要再点一下step,那这时候大家能猜到是多少了吧。这时候呢,实际上是把他之前的这些呢,来看一下我们当前的字符串常量池里边一共是有多少个字符串了,那显然的话呢,我们上边这个一在之前的时候呢,已经是不是加载过了,所以此时这个一呢就不会再去加载了,接着的话呢,我们这个位置是不是也应该是2304,那加载一看是不是确实是2304没问题。
04:04
那我接着呢,再进行一个这个操作啊,直接蹦到我们下个断点这个位置,那在这个位置的话呢,显然呢,是不是前面这些这个字符串呢,都已经在我们常量池当中存在过了,所以呢,这个结果是不是也应该是2304啊。2304没问题。是这意思是吧,那那我要是再执行下一步的话呢,这是不是仍然是2304 OK行,那这呢,我就直接结束了哈,通过呢,刚才咱们这个debug的一个演示呢,大家看这几个数值,我们这个呢叫2304,诶跟我们这个2294正好呢,是不是差这十个,这十个的话呢,就是咱们之前这十个相当于呢,就在我们字符串常量池里边这个加载过啊,当你首次出现一二三四五六七八九十的时候,我们就做一个加载,那加载完以后呢,当你再出现相同内容,咱们这里边儿所谓相同内容看在这里边明明确规范了,说Java语言规范里边要求完全相同的字符串自变量。
05:01
那怎么叫相同呢?就是包含相同的这个,嗯,这个unicode的字符的序列的啊,就是咱们所谓的就是你这个字符序列呢,它这个对应的这里涉及到一个叫马点序列,这个值呢,是一样子的情况下呢,我们就让它指向的是同一个实例。啊,就是它指向的是同一个实例,其实就是我们字符串常量池里边的,只要你这个字符序列它这个值是一样子的,我们就不会再去创建一份。哎,就是这个意思,相当于我们在这呢,如果写一个说明的话呢,就是诶如下的这个字符串这个一那一直到啊,咱们这个组考十啊,就不会再次再加载。那就是这样的一个道理,行这呢就是我们想强调一个问题,那么关于这个字符串,这个字面量的一个描述啊,大家有兴趣的话呢,你也可以看一下咱们相应的这个规范,嗯,Java SE的具体的一个规范,以前呢,咱们在刚开始讲这个课的时候呢,其实提到过这个文档啊,呃,大家呢,直接就咱们现在是主要讲的是基于JDK8是吧,所以大家就看这个就行,Java语言的一个具体的描述,打开atml,在这里边呢,我们在第三章的第十节关于字面量这块提到了像string啊,Float啊,布尔啊,Character是吧,字符啊等等,那其中呢,三点十点五就是关于我们这个叫string啊,Liter说的就是string的一个字五串。
06:24
哎,自变量哎字符串字变量行那一个字符的话呢,是表示这样的一个范围是吧,就是两个字节的范围,就是给每一个字符串呢,其实我们都有一个叫马点序列啊,满点序列就相同,马点序列的这个字串应该是同一个啊,应该让它指向同一个实例啊。行,这个呢,就是我们说的第一个点啊,应该说是这个结论呢,大家是比较清晰的,那接着我们来看这个第二个例子啊,通过这两个例子呢,大家感受一下我们平时的一些这个点啊,那第二的话呢,就是我们写了个没方法里边呢,定义一个变量,用了个对象啊,又用了个当前类的对象,然后呢,调了另外一个fo的这样一个方法,这呢实际上是我们这个规范官方里边给的一个案例。
07:04
啊,给一个案例,这个案例呢,它对应的这个图呢,也给画出来了,那不妨呢,我们此时就把这个图呢给他盯一下。哎,就是大家呢,如果去画内存结构的话呢,你看能不能这个画出来这个结构,咱们就一点点往下走一走,好来,我们看首先的话呢,这一个内方法,然后这呢是一个fo的方法,在我们这个main方法当中啊,咱们调用了这个方法,实际上呢,这是一个进程,对吧。啊,一个线程说错了啊,一个线程,那在这一个线程当中啊,咱们有两个方法,这两个方法的话呢,分别是may和我们这个fo,那先放的may,先执行may嘛,先放may,然后再放fo,这就是两个战争呗,然后在这个may方法当中呢,嗯,像具体这个X参数呢,我就不往这放了,实际上也有对吧,就不放了,那这呢,先定了一个变量ii是一,然后呢,又new了一个接,那new的对象呢,我们说都放在这个堆里边,放在这儿,这是堆空间。那这个往上拽一下,这边是写着对空间对吧?行,嗯,这是付给我们这个战空间这个may的,这个战争里边的局无变量表里边的OB接,那它呢,是保存了一个地址,然后呢,同样的道理呢,是一个memory指向的,还是对空间中引用的一个memory对象行,然后接下来的话呢,把我们这个obj啊作为一个参数赋给了咱们另外一个方法,那就是起了另外一个战争,这个战争里边呢,放了一个叫per,这个per的话呢,其实也不是咱们的第一个参数。
08:25
这个大家理解吧。哎,这个呢,结合咱们以前的知识,我把当前这个代码呢,做一个编译。然后的话呢,我们看一下这个叫接lab。啊,大家看找咱们当前这个memory啊,Memory里边方法呢,咱们看一下这叫fo行,那fo的话呢,那大家看一下我们这里边算上有几个局变量表里边有几个变量呢。按说呢,这是一个,这是一个,看呢是似乎呢是有两,实际上呢,我们说是不是有三个呀。诶,你看这个代码里边这个指令上来呢,就是把我们这个per啊,它呢,就是做了一个lo,做了一个加载啊,做了一个加载,加载呢就是放到是这个一的位置了。
09:09
那怎么上来放这个一的位置呢?那因为这里边你看涉及到我们这个零呢,是不是一个Z啊,非静态的方法呢,它的局部变量表里边呢,首位置的咱们放的是Z,第二个呢,放的才是这个perel是吧?然后呢,第三个呢,放的是咱们这个itr,那这呢,你看写的比较清楚哈,好再回来,那么我们把这个嗯,你may方法当中这个per,它的这个per,这个对应的是我们这个m me m这样个变量,把它这个值呢,是不是给了我们per per,所以per的话呢,也指向了对空间当中你new的这个叫object。指向是它,然后呢,这个P掉了一个叫to string的方法,这个to string方法呢,返回的这个字符串,这个字符串呢,就是存放到我们的字符串常量池里边,记录了就是你当前这个对象的一个类型和它具体存储的一个地址。然后呢,把它赋给了I tr,这个IR呢,是我们f fo这个方法里边另外的一个,就变量表里边的一个变量,那它呢,就也指向它,最后呢做了个打印是吧?哎,就是这样的一个环节,当然呢,看这个过程呢是不是清晰。
10:12
你看你自己能不能画出来,然后这块呢,有一句话说呢,一个字符串呢,被创建在第七行,就是我们的这一行。一个字符串上被创建。创建在哪呢,说它呢,会放在我们的string铺当中,在咱们的堆空间当中,通过这呢,也能证明咱们在堆空间里边是不是来存放磁串常量值啊,对吧,然后呢,它有一个引用呢,也被创建了,当我们这个F5方法呢,这个stack就是你当前这个站空间里边创建一个,其实就是对应我们这个I tr嘛。把它这个地址呢,返回给咱们这个itr这个旧变量表中的变量。OK,行,那大家呢,通过这两个例子,哎,把咱们呢,之前讲的一个长量池里边不允许放相同的字符串,这个呢在结论给大家明确一下,然后这个呢,是咱们平时见到一个场景。
11:00
注意这个场景里边呢,咱们其实没有出现news润这个news啊,咱们放到下边的内容当中给大家来讲。啊,放到这个咱们这个第五节讲到这个啊,Inter这个方法的时候呢,咱们给大家说好,这呢是我们刚才呢,通过两个例子呢,大家对咱们string当中的这个基本操作呢,有一个了解。
我来说两句