00:00
那么这几个算法题呢,咱们就先暂时过掉了,过掉以后呢,咱们接着往后来说,这个string呢,讲完了,但是跟字符串相关的类呢,不止string一个,String呢,我们称作叫不可变的字母序列,那还对应着有可变的,这里呢就提到了叫string buffer,那一个呢是string buffer,还有呢,我们后边要说的一个叫string builder,这两个呢,都是叫可变的,那我们就相对来讲啊,结合着一起来说一下。嗯,这呢,就是咱们讲了一个string,那我这呢也还是写到这里边。String buffer这个我就直接都写这了啊,叫builder的一个测试。嗯,这个呢,我们写到这啊,诶关于诶string buffer和string builder的一个使用。好,首先既然呢,你引入了两个新的跟字符串相关的这个类呢,我们要关注的就是它俩呢,跟咱们说的这个string呢,哎有什么区别,好这块呢,是咱们说的第一个问题,说string,它string buffer string builder,哎三者的叫一同吧。
01:20
这呢也是一道非常高频的第示题啊,也需要大家呢来掌握啊,那咱们就来写一下,首先说到这个叫string,这呢string buffer,哎,String build啊,没写错行,首先这个string string的话呢,这个类咱们那会儿也都看过了啊,这没有crl shift t一下string。点进来在咱们JDK一开始来有的时候呢,就有它了,那JDK1.0就有了,那就相当于是比较早的这样的一个类了,啊这个类的话呢,我们上午也讲过了,它呢叫做不可变的字符序列。
02:02
啊,这是它的一个明确的特点,嗯,那么对于string buffer来讲呢,它呢叫可变的字符序列,那么string builder呢,也叫可变的这个序列,就是先呢,把这俩跟这个string呢,咱们先划开,说你呢是不可变的,我俩呢都是可变的。那咱俩都可变,咱俩有什么区别呢?哎,String buffer ctrl c ctrl shift t。对啊,首先看一下它,它是不是也是1.0啊,也是比较早的一个类,然后呢,我们再看这个string builder这个T点。哎,它呢是JDK这个1.5的时候呢,我们新增的。啊,那么相当于是一开始的时候,咱们就有这个叫string和string的这个buffer,这两个就都有,后来呢,是加了一个string builder,那为什么要加呢?是因为这哥们呢,效率有点低,那为什么效率低呢?啊,因为呢,我们把它做成一个线程安全的了,所以呢,这个string buffer啊,我们把它称作叫线程安全的。
03:08
啊,那线程安全带来的这个弊端咱们也说过了,就是效率呢偏低,嗯,什么叫线程安全呢?这个我们打开STRING8FOUR,你往后看它的这些方法。都是同步方法是吧?哎,所以说呢,它就是一个线程安全的啊,这个就很好理解了,那么哎,这是我们说的这个叫string buffer了啊,那string builder呢。哎,String builder的话呢,我们打开这个你往下看,实际上呢,这个string builder呢和string baruff for,从这个方法上来讲啊,其实他们基本上都是一样的。啊,你那有添加,我这有添加,这都差不多一样,那区别呢,就是它这里边没有那个S了,没有S呢,那就是线程不安全的了。啊,就是这样情况啊,那线程不安全了,那好处呢,就是效率呢,呃,就高一些。
04:06
哎,效率呢就高一些,哎,这是这样的点,嗯,那么我们在开发当中,这个咱们这这不刚才也说了,它是这个JDK。JDK5.0新增的啊,把这个也写上,诶,人家是这个新增的线程不安全的效率高,那么我们引入string builder呢,就是为了能够体现它效率高这个事儿,但是呢,它也有相应的一个弊端,那咱们在开发当中到底怎么选择呢?那就看首先是不是一个多线程问题,那你要连多线程问题都不是。是不是一定用它了。诶,因为只有多个线程操作共享数据的时候啊,那就意味那个共享数据呢,那恰好就是它了哈,诶我们才考虑用string buffer,否则的话呢,你要不是多线程或者说呢,不存在多线程的线程安全问题,我们都建议用string build。
05:04
啊,都建议用string builder,嗯,凡是呢,我们像这种新增的这种东西,跟原来的东西呢,功能还类似,那新增呢,一定有它的意义,就是原来的可能某方面不好了,我们才要新增是吧?哎,这呢就是为了提高这个效率啊行,比较典型的关于这三者的这个区别呢,我们就说完了,那也有一个相同点啊,或者有没有什么相同点呢。相同点呢,就是它们三者呢,都是跟字符串相关的,字符串相关的具体呢,再体现呢,就涉及到这个底层结构,我们说使用叉型数组进行存储,String底层用叉数组存储,咱们都已经看到了,是那个VALUE6,那我们string builder呢,先看string buffer吧,String buffer。嗯,在这string buffer,然后它呢,继承于它,然后呢,下边你看到是不是也有一个这个叉形的一个数组是吧?嗯,这个差异数组它是用它存的吗?咱们就可以找它的一个构造器你就知道了,我比如说用一个这个吧。
06:11
用这个嗯,Aend它,然后这第二个,它这呢是第二它啊就跑到这儿来了,哎,其实呢,我们看到的那个还不是。还不是啥意思呢,你看我们这个string buffer啊。这个就往上调一下啊,这是咱们这个string buffer,这个string buffer呢,它底层呢,其实也是用查询数组来存的,嗯,但是不是这个结构。不是这个结构它呢还继承了一个负类,这个负类呢,你点开,那永远还是这个查询的数组,那因为我们不是继承一个父类了,那你这个负类的这个结构不就过去了吗?哎,就继承到了啊,哎还是在这里边去存在,我们会发现这个前面是不是没有加final。哎,人家呢,是一个可变的。
07:01
啊,是一个可变的行,那么对于我们的string buffer build呢?我刚才看的buff掉到它build没有了啊,在这呢啊。诶,它呢,负类啊也是糖。是一个结构,哎,那又也是用它存的,所以说我们这里边提到的,嗯,底层呢,使用差异数组存储,它们三者呢都是。这俩是没有区别的。这个能理解是吧,我们看源码看的啊好了,那自然而然的又引出来一个问题,说呢,嗯,你呢用插上数组存,哎,这个不可变,哎我呢也用差生数组存,我就可变啊,这个同样是人啊,为什么做人的差距啊这么大呢,是吧?都是用差异数组存,怎么它就不可变了,这俩就可变了呢?
08:03
是不是会有这样的问题啊?那同学我我我没这么想是吧,没这么想,那你就想一下是吧,说为什么说这俩就可变了,当然这里边呢,首先你得清楚什么叫可变嘛。可变呢,就是说比如我这原来有个ABC,呃,比如我调一个,呃,这个咱们就写一个例子吧先啊一会呢,咱们具体再说这些方法,先把人家这两个的内存的结构呢,我们也稍微提一下。好,嗯,什么意思呢,比如我这写一个啊这个string,咱们就先拿这个八来说吧,这个不太好听啥的是吧,嗯,String的一个string buffer这里边呢,我先暂时写一个ABC吧。这是ABC,然后SB一点,咱们有一个呢,也叫replace,呃,Replace从指定的位置开始,到指定位置结束,做一个替换,这个呢,我算了,我就先不调它了,这个有一个叫set char啊,这其实也算一种替换了,Set,我们指定的位置,比如说我就把这个零位置上的我换成一个M啊,就换了,换完以后的话呢,你看这个方法啊,往这一放,这个方法呢,还是个word,它也不涉及到返回。
09:30
不是,这不涉及到返回,你说我这个时候呢,如果要是去打印一下这个SB1它呢,是叫ABC还是叫mbc啊,对,显然是mbc了。啊,那他也没有返回,你像咱们说这个string呢,是一个不可变的,它通常调一个方法修改以后,它都会返回一个新的是吧,新的是你变以后的这个不变,这叫不可变,现在咱们这个拿着string buffer呢,我去调一个重新设置一个值,它就是真的把我们这个ABC里边这个A改成M了,它连返回都没返回啊,就是把它给改了,所以这呢就叫做可变的啊,那简单的通过这个呢,暂时体会一下,那回过来我们去说一下,那大家底层都一样,都是查行数组,那怎么这俩就可变了,这个就不可变了。
10:16
它是怎么设计的,对这个里边那个是final是吧?哎,然后它这里边儿呢叫可变,可变呢,这是咱们说的是个替换,那是不是还有可能是这种情况,比如我这里有个ABC。我现在想往后边加上一个DEF。那你要说可变,那你就不能重造,就相当于你还得在原子的数组数组上去用,是吧?原有数组还得用鸳鸯数组,难道长度不是三?你要原来长度是三的话呢,是不是就没办法说再接着往后补啊,诶那这时候呢,既然它叫可变,它呢底层造的这个数组啊,还确实不是哎,比如我这叫ABC,确实这个底层数组的长度还真不是三,哎,通过这样的方式就是我我这个建的比较长啊,建在比较长的话呢,你把ABC呢放进来,然后你又再去添加一个DEF,我就能够还让你在原有的这个速度上面呢,去补一个DEF,这样呢,这不就体现了可变了。
11:23
我可以在原有的这个基础上变,这叫可变。
我来说两句