00:00
行,那这个说完以后呢,这块课后有一道这个练习题,这个练习题呢,实际上是一道面试题,这个面试题呢,其实考察的就是我们关于死string的一个不可变性的一个考察哈,呃,这里边呢,我们是放了一个字符串,放了一个查询数组,然后呢,我们将这现有的两个属性啊,一个是string字符串,一个是查询数呢,往里边放进去,放进去以后呢,放进去以后呢,我们对这两个形态呢,做了一个重新的赋值,那最终的结果呢,会发现呢,你这个string啊一开始叫good,然后呢,里边呢改了一下,实际上呢,结果呢,是不是没有变,还是叫good是吧,而我们这个插型数组的话呢,你把里边的这个B呢改,呃T呢改成B的啊,结果呢,发现确实呢是修改了。哎,就成这样的情况,这呢就是一道笔试题,而且这道笔试题呢,在不同的这个公司当中都出现过啊,都出现过啊,嗯,其实在整个呢,大家去面试技术的这个笔试也好,面试也好,你会发现呢,还挺神奇的是吧?诶怎么叫神奇呢?不像大家高考或者考研,就是你永远不会遇到原奇的。
01:02
啊,你把这个近十年的全国各个省份的高考题全做一遍,你放心一定不会遇到原题,如果你遇到原题的,这绝对是一个事故。啊,那你相应的这个出题人呢,一定是要被呃,谈不上说开除吧,是吧,那这些人呢,他以后呢,再就没有这个出题的这个资格了,一定不会有原题,当然呢,大家呢,对于面试这个程序,这个程序员来讲,不管你是面试的这个大厂的是吧,你还是面试的这个一般公司的啊,中级也好,高级也好啊那么这些题目呢,实际上呢,我们会看到有一些是极其高频的,有些题目呢,是翻来覆去出的,或者换句话说呢,都是那些高频的题啊题呢都一样。啊,就这样的,因为没有人专门在公司里边,就是跟你去编这些问题是吧?啊没有这样的人啊,这个大家呢,更多的精力都是在开发过程当中,另外一个角度就是说,呃,其实这些问题的话呢,你在网上都能找到啊,考的就是这些题,那我就告诉你了,然后呢,我在面试的时候时候呢,我照样的可以呢,呃,咱们通过交流的方式,我能知道你到底是真正掌没掌握这样的技术,还是说你是死记硬背的这一面就能面出来。
02:03
啊,这是非常容易的事情,你要说呃,这个面试官呢,是一个新手啊,面试的时候看不出来,你想当你面的这个几十个以上以后的时候是吧?哎,你再去面试,这个是非常容易的就能够被看出来的啊,所以说呢,即使告诉你是高频的也没有关系啊,你该复习复习是吧,那那你要复习的好的话呢,那相应的你把这个技术呢,也就整熟了,也是个好事啊行,那这就过了,然后的话呢,我们看下边这个点啊,这呢提到说字符串常量池是不会存储相同的字符串了,这也是咱们要说的这个基本特性中的一个点。记住这句话。这个字符串常量池里边咱们不会存储相同的内容的字符串,那一提到这个不能存储相同的内容,大家是不是就会想到我们集合当中的一个特别的东西是吧?集合里边记得吧,咱们集合当中呢,嗯,讲过set,那这个set的话呢,我们说本质上呢,是不是又是一个map呀。啊,比如说哈希set,本质上它其实就是一个哈希map对吧,那这个map的这个key呢,它其实就相当于是一个对应的set了,他们是不能够有重复的,那这里边我们想说的就是string呢,怎么就能保证这个常量池里边不能放重复的数据了,哎,我们说底层啊,它确实还就是一个map。
03:12
哎,底层就是一个map啊,由它呢来实现这样个点啊,所以这个问题的可能有很多人不清楚啊,把它呢记一下,这个string对应的我们这叫string,就是这个常量池,它呢是一个固定大小的string table啊string table底层我们说是一个数组加列表的结构。不用多说吧,数组加列表都清楚吧,哎,那既然是数组呢,一定是固定大小的嘛,那这个默认长度是多少呢?还是1009,注意这个呢是在以前的版本中啊,在JDK6当中呢,我们固定的大小是1009,那在JDK7的时候呢,这个长度呢,实际上就变了啊60013啊,变大了,那你想为什么要变大呢?哎,能想清楚吧,哎,看这块也有介绍是吧。说呀,如果我们放进这个呃,String po当中的这个string啊,非常多的时候呢,就会造成这个哈希冲突,那冲突的话呢,我们呃说呢,既然你两个字符串本身不一样,但是呢,你又得放到数组中的同一个位置,怎么办啊,是不是以列表的方式来进行存储啊,那你要是这个数组长度比较短的话呢,咱们是不是就导致这个列表呢,有可能就特别长,那一旦长的时候呢,我们再进行添加,发现又放这儿,你进行判断也好,包括获取也好,整个来讲的话呢,我们都需要去编利这个链表,那你这个时候呢,效率肯定是差一些。
04:23
对吧,那我们尽量呢要少出现电表,那你要想少出现电表是不是速度要长一些。很简单一个道理,对吧,它还不像咱们前面讲的那个map呀,或者是set也好,它这个在默认情况下达到我们这个叫0.75是吧?哎,就是我们整个这个呃,长度啊,再乘以0.75,得到这个临界值的时候呢,它会自动的扩容,咱这呢就没有扩容了哈,它那就是一个固定大小了,它不会扩容,那既然不会扩容,那你这块呢,要是短了,那真的就是链表就很多了,所以尽量的我们是不是造一个稍微长一点的这样的一个底层的一个数组,对吧,那是这样的情况啊。行,呃,那么在这个七的时候呢,这个默认的长度就变长了,那我们呢,也可以去修改,哎,那修改的话呢,这里边就提到个参数叫做string table的size啊string table size啊,通过这个参数呢,咱们进行一个设置,行,那首先的话呢,咱们来看一下我这写好的一个程序啊,这个程序的话呢,先把下边这个代码呢,先给它注释一下。
05:18
诶注入掉,然后把上边这个大家打开,嗯,到这啊打开,诶非常简单,这个代码呢,就是打酱油的。打酱油的啊,这呢,我是让当前这个程序呢,去停一下,这个叫1000秒是吧,那1000秒时间呢,相对比较长一些,然后呢,我把它抛起来,咱们先设置一下当前是13是吧,把它的这个结构改一下,咱们调到这个1.6当中。这是六。行,然后呢,这块呢,咱们也做一个调整。啊,这个,嗯。这个是13了是吧,这个改成是capital特13啊,就我们第13章,嗯,然后呢,这块找一下咱们是这个string的,咱们是解二是吧,嗯,这样啊,其实这个参数呢,咱们先不设置,不设置的时候呢,咱看下这个默认值是多少,哎,这个呢,把它改一下,咱们改成是六。
06:11
现在这个JK6的场景下,咱们看一下啊,把这个程序跑起来。嗯,起来了是吧,那起来以后呢,咱们开这个命令行啊,这个WIN2CMD进来,哎,首先JPS查看一下咱们当前这个进程,然呢还记得我们这个命令吧,接flag,然后呢,输入我们叫string table的那一个size s对应的我们这个进程4060啊回车一下。诶是不是很清楚,我们这时候呢,是1009,也就是说在我们GJDK6当中呢,我们这个呢,是叫1009啊,那我们要是给他做一个修改呢,修改我们先把它停下。此时呢,咱们再打开我这呢,就改一下,改成string table size,比如说我就改成十。
07:02
已经很小了是吧。再跑起来。嗯,可以了,然后回过来再接着先呢是GPS找到当前进程,然后呢改一下。这个5436这个呗。好,再回车。好,这时候大家看到是不是就改成十了,言言之意呢,就是我们在JK6的时候呢,你想改成几都行,默认值呢是1009很清楚是吧?诶这里边我也写着,哎,默认值是1009啊然后呢,可以做一个,诶这这这没有设置没有要求啊,这呢,其实都是我实际测试当中,诶根据测的这个结果呢,写的咱们这个课件啊,行,所以呢,反回来它肯定错不了,是行,然后呢,这是我们说的这个JDK6的一个情况啊,我把它那关掉,关掉之后呢,咱们来看一下这个JDK7啊,那首先呢,我们去修改这13,把它改成这个七。应用啊OK是吧,然后呢,我们再执行这个。
08:01
嗯,我们把它改成七。可以了是吧,这个改良器以后呢,先呢,咱们不设置它,把它呢先去掉。跑起来。行,然后接着呢,再打开这个GPS。嗯,然后呢,我们再来测试一下它的这个默认值,嗯,9176。啊,回车。好,这时候大家看到我们在这个七当中是不是叫60013啊,就是变成这个6万多了是吧?哎,6013那底层我们这个速度长度就变大了,虽然呢,占用的内存会稍微的多一些,但是呢,我们,呃,如果你存储这个存轮比较多的时候,它的性能还是比刚才那个1009要好很多的啊OK,这呢是我们看到这叫默认值,嗯,行,这个呢,我们先把它停下来,接着呢,我们试图的去给大家设置一个值。啊,设这个值啊,这个参数放这这个,那咱直接从这粘一下啊。你看这是我在设置的时候呢,注意比如说我这是这个1800。
09:00
我设这个1000啊,然后呢,我做apply啊,做一个OK,我们再来执行。我们在这儿呢,测试一下哈,哎,先GPS。然后呢,再看一下当前是二八。呃,2884啊。啊,行回收。好,这呢是1000,哎,相当于设置成功了啊,那我们再给它改一个版本,我把这呢改成JDK8。然后这个位置呢,诶先停一下,把这个呢,我们再改一下。就改成八。行,然后呢,上面不变啊,OK,再来执行。哎,你看这时候呢,是不是就报错了啊,哎,那我这块呢,测的时候我这写的还不是特别的精确啊,这个在JDK7当中呢,我们string table呢长度是它,哎,那么这个还得再回一个啊JDK80或者叫JD8开始咱们这个string table的这个长度。
10:01
哎,要求呢,这个最小值,哎,就是如果我们要是设置诶,String table它的长度的话。那1009呢,是它可以设置的一个最小值,诶刚说这个PPT没问题呢,是吧?诶这个呢,都是实际呢,我来测出来的啊,就是在JDK7的时候呢,我们看到这个默认值是它在GB8的时候呢,我刚才没测这个,我就不测了,这个值呢,还是它,但是此时的话呢,我们再去设置你这个string table它的一个size的时候呢,这时候就有要求了哈,在这个七的时候呢,还是没有要求的。啊,就是跟我们这个一样。哎,它的设置呢,没有要求。嗯,我就直接粘到这儿了。嗯,但八的时候呢,就不行了,你不能这个瞎整是吧,你整的这个数太小的话呢,我们这个性能呢,就降的太厉害了,那这里边提到你这写的是1000,但是呢,我们要求候呢,你这个BETWEEN1009啊,到我们这个数,这个数已经非常大了啊,一般咱不会设置到这么大啊,那这样呢,就是我们的一个底线,你不能设置的太小。OK,清楚是吧,哎,这是我们在八当中去演示的啊,行,这呢是我们关于这个string table这个参数啊,大家去理解,在不同的版本当中,它有一个细节上的变化,然后呢,咱们现在呢,想给大家是举的这样一个例子。
11:12
这个例子的话呢,诶是咱们想测试的一个点,哎什么点啊,就是刚才你提到了说你这个呃,数组呢,它要是短的话呢,这个性能呢就差了,那长的话呢,这个性能就好了,那通一个代码演示一下呗,那咱们这个代码就来了啊我把这个程序呢打开。啊,打开了是吧?行,嗯,我呢是提前先得写另外一个程序啊,这个程序呢,是这个我昨天写的啊,啊也快12点啊这个时候写的,嗯,什么意思啊,我现在想生成一个T文件,这个T文件里边呢,一共是有这个10万行,10万行啊每一行的话呢,是呃,放我看我这写的是多少,哎,这个每一行的话是放一到十个字符,这个字符的话,字符的话呢,只能是大写的这个A到Z,或者是这个小写的A到Z啊只能是这样的一些字符,这呢是这一行产生指定这个长度的一个字符。
12:04
哎,只能是大小写的这种情况,然后我一共呢,是产生了这个叫10万行,那具体这个细节我就不用给大家讲了,是吧?哎,这个不用讲啊,只能我们使用的这叫fair writer呢去写出去行,那我先把这个程序呢得跑一下。啊,完成了还是比较快的,这个完成以后呢,针对于我们这个,诶没方法的这样一个方式去往外写,它默认的一个相对路径呢,是在我们当前的这个工程下哈,当前的工程的话呢,是不是就在这儿是吧,还生成了啊双击一下打开,哎这呢,就我们生成的这个一共是有10万行。嗯,10万行啊,这个最后他这相当于后换行了哈,诶10万行这个数据没问题,那接下来的话呢,我们是想把这个数据啊,诶每一行呢,都给它读读进来,读进来以后呢,放到咱们的字符串常量池当中。10万个呀,可是OK,那这个时候往里放的话呢,我们就看一下你这个数组的长跟短,是不是就会影响到我们这个性能了,对吧?好我们再打开这啊这个时候呢,我使用的叫呃buffer reader,因为buffer reader有个方法叫read烂啊读一行读一行,那读完这一行的这个字符串的话呢,我们就第二个这个叫int方法,这个in inter方法的话呢,大家呃,咱们提前呢,呃先用一下哈,诶大家正常在开发中应该也接触过它呢,就相当于是呃在啊字符串哎,常量池重。
13:23
啊嗯,这个其实准确说应该是两种两个情况啊,就是如果你这个data呢,对应的那个字符串在常量池里边没有,我们就生成,如果要有的话呢,诶就指向那个,诶应该这样说吧,说如果是吧,哎,字符串常量池中没有,哎对应这个data塔的,哎,Data塔这个哎字符串的话啊,则在长量池中生成是吧?哎,生成,那你想想我们有还是没有,你是不是得判断一下,那这个判断的话呢,其实就类似于我们说的这个map也好,或者叫set也好,咱们得去你底层的这个哈奇table里边,诶是不是往里边去判断一下去找是吧,那你这个呃,链表多的跟列表少的情况一定是不一样子的哈,好,那这块呢,我们就去读,看看这个花费的时间是多少,这呢是我之前测的这个情况哈,诶,我这用的两个指标,一个是1009,一个呢是这个10万。
14:16
哎,这个是100009啊,那我把这俩参数呢,就直接干掉,咱们呢再重新的再测一遍,那好了,我把这里边儿这个参数呢,做一个修改先呢,咱们设置一个比较小的。嗯,现在给它改成叫1009啊,咱就用一个所谓的最小值啊,OK执行。跑一下。看一下,此时呢,我们去,嗯,1009,诶刚才写的是109啊,再看一下。哎,针对我们这个啊,10A1009嘛,是吧。好,这呢,我们花费了叫143毫秒,诶这个时间其实也算是比较快的啊。
15:04
嗯,可以了,呃,那么接着呢,我们把这个数据呢,给它调到相当于底层这个哈,Table的一个长度呢,就变大了。在这呢,咱们再补俩零,哎,这个就是相当于是100009。嗯,十二零九对没问题啊,好停OK。跑一下。哎,这个你看速度是不是更快,47毫秒。嗯,这个呢,就是因为呢,咱们,嗯,这是100009啊,咱们底层的话呢,这个数组当中出现的列表呢,就很少,那这时候呢,我们通过这个哈希算法呢,直接定位到你所处的位置,那个位置上有,那就有没有就没有它这个链码呢,几率小了,那你这个速度肯定就要更快,能看出来是吧?行,那通过这个例子呢,咱们想强调的点呢,就是这里边提到的啊,如果你这个长度有点短的话呢,这个性能呢,会下降的比较厉害,好这呢是咱们说的这个基本特性的这个点啊。
我来说两句