00:00
好,那接着来我们再来看一下JAVA12当中对于string当中的一个变化哈,嗯,大家呢,如果关注于我们JDK的更新的话,你会发现关于string这个结构呢,其实呃,在很多版本的新特性当中,多少都会涉及到它,诶毕竟呢,String我们叫字符串,是我们实际开发当中,大家呢避不开的一个类,诶或者说我们经常使用的一个类啊这个字符串呢,其实我们经常去用了,呃,比如说我们在呃提到障VA6的时候呢,说这个字符串呢,是存在这个符串常量池当中,呃,字符串常量池呢,是放在我们的方法区的,哎,这是我们说的这个JAVA6是吧?哎,方法区只要个自差常量池,那Java区当中呢,我们把这个自砂常量池呢,放到了我们的这个对空间。哎,这呢是一个变化,呃,接着的话呢,我们在这个JAVA9当中,呃,提到了这个string的底层结构啊,也做了一个变化,呃底层结构什么意思呢?String我们叫做字符串啊,这个图啊,或者这个所谓的叫象形文字是吧,大家应该非常熟悉啊,就是下面的时候呢,你出去,呃这个字呢,应该经常见。
01:02
啊,羊肉串,烤羊肉串啊,不管中国人熟这个,全世界人我觉得都能看得懂,羊肉串嘛,这就是一个一个一个木棍或者一个签子是吧,然后上面呢,就是一块块的羊肉啊,这叫羊肉串啊,那我们现在呢,叫字符串,就是字符构成的串,所以每个位置呢,我们说诶都应该是一个字符啊,没有问题,那么以前呢,我们知道这个齿轮底层啊,都是使用查询数组进行存储的啊,非常合理,但事实上我们发现呢,相对于这个,呃,英语体系的这个国家来讲,他们做开发的时候,包括咱们做开发的时候,咱们写的都是这个英语的这些字符了啊,那如果你存储的实际数据也是英文的,像ABC这样字符,我们知道呢,其实像ABC它其实用一个字节呢,就可以存储了,那也就意味着我们在内存当中呢,呃,明明能用一个字节存储的,我们用了两个字节,用一个差就存储有点浪费,所以说呢,在JDQ9当中,String的底层结构就变了,不再是string了,而是改成叫带数组。哎,加上一个字符编码机。那如果呢,你存储数据呢,就是像abcd这样的数据,那我们就用bad数组去存了,那如果你要存储的像咱们中文的这个字符啊,AB这个这个比如中国是吧?啊,那这个时候呢,我们就相当于还是用两个字节,相当于是一个叉去存储这样的一个字符。
02:15
哎,属于这样的情况啊,就更加的节省内存空间了,那相应呢,我们buffer build呢,他们的底层结构呢,也做了一个修改啊,都改成PA数组,加上这个字数编码级了,相当以后呢,大家再去说这个string底层结构的时候呢,就不要再说是一个插型数组了,在JAVA9当中啊,已经做了一个变化,那么后续的版本当中呢,我们对这个s string呢,有的时候经常会一些呃外的操作,加一些方法呀呃加些功能啊诶等等啊,这个s string呢,因为我们用的确实比较多啊,那咱们在讲这个JAVA12呢,一开始提到叫GM长链API的当中,我们也提到这个string啊,实现了两个接口啊,就这里边提到了,一个呢叫呃constantable接口,一个呢叫constant DA接口。啊,那这呢,我们是不再谈这两个接口问题了啊,那额外的我们再讲两个方法,一个呢叫transform方法啊,形态呢是一个方式,另外一个呢叫做。
03:07
呃,这个在下边啊啊in的方法啊,这呢提到一个就是左边呢,去提供这个空格符的啊这样一个方法,诶这呢是我们要说的两个新增加的方法啊,那先看第一个叫transform这样一个方法,那这呢咱们还是通过一个代码的方式呢,给大家做一个演示,还是在我们当前这包下,我们去新建一个class,对关于string的一个test。哎,写一个单元测试。川。好这个方法,那我们这呢,比如说先写一个哎,Hello啊点二,哎,我们来一个这个叫哎,Transform这里边呢,我们需要传一个具体的函数了,那函数的话呢,我们知道需要指定相应的一个呃,自变量是吧,呃,不是自变啊对这个我们从函数角度叫自变量了,然后呢,你再指定对应的一个操作是什么就可以了哈,比如呢,我们针对于咱们刚才传进来的这个数据啊,这个我们叫INF for啊,然后呢,在它的基础之上啊,In for点啊in for呢,我们做一个连接啊,加上一个word。
04:16
哎,这样子好,然后al enter,哎,我们让它再生成一个对应的搜串,诶不妨我这块也交给infer了啊,然后infer.s al一下。那这呢重名了是吧,诶叫in for1,嗯,这样好,我们跑一下啊。嗯,出来了,这时候大家会发现呢,我们呃在hello的基础之上,呃,它呢,其实就是我们这里边提到这个infer这个变量了啊诶接着呢,再去拼接了一个word这样的一个字串啊,就运行出来我们这个结果啊,这个transform这个方法呢,是来自于我们啊JAVA12的具体的操作呢,其实就相当于是把我们诶当前的这个对象哎放到我们ipad相当于自变量的一个位置,那么运行完以后呢,得到音变量做一个反回结果啊,那这里我我们做的这个事儿呢,就是做了一个拼接操作。
05:06
啊,这呢,就是我们叫transform这样的一个情况啊,那这个transform呢,它返回的就是一个字符串,那既然拿到这个字符串呢,我们还可以连续的再去调用transform。啊,相当于一个方法链的一个调用方式啊,来再写一个例子。哎,这个我们叫一,嗯,不妨呢,我们就还把刚才这个代码呢,给它拿过来,CTRLCCTRLV。这样啊行,那拿过来以后呢,我们在这个基础上呢,再去调一下这个transform,比如说我们想把咱们刚才输入的这个字符串呢,变化成大写,这呢,我们还可以用一个方法引用啊,String叫to up case。啊,那返回来又是个字符串,返回这个字符串呢,我们再做一个什么操作呢。嗯,点二,哎,我们再去调一个叫transform,呃,比如说我们这个现有的字串前后加上一些所谓的这种空格是吧,我们还可以再去调用这个,诶,String叫一个tri方法。
06:11
哎,就是去除前后的这个空格啊,这样的操作好这呢,我们再去生成对应的一个局部变量。哎,这个我们叫诶in for,这个我还叫一个in for1吧。行,那我们在这个Java师当中提到了一个新特性,你看我这呢,是不是可以写成这个叫腕啊。哎,其实也是OK的啊,叫局部变量啊,生命成Y这一个是类型推断啊,那in for一点,我们再做一个s out输出。跑一下。诶,没问题啊,你看这个呢,我们输入这个hello word呢,它前后的空格呢,已经被我们给去掉了。那这呢,就是我们相当于连续调用的方法,那大家会发现哈,就是我们一开始的时候啊,咱们以这个为例吧,我们是一个hello,然后的话呢,我们这个hello呢,变化成了叫hello word,接着呢,这个hello word呢,变化成了一个大写的。
07:04
Hello word啊,当然了,一开始的时候我们这块前后是有空格了是吧?啊,这个word呢,也有空格,空格啊,这有空格,这有空格,然后我们再调用这个吹用方法呢。把它变成一个没有空格的一个hard了。想说明什么问题呢?大家有没有发现我们调transform其实呢,实现了由前一者映射成后者,再由前者映射成后者,再由前者映成后者,这其实就是一个映射。啊,这就是一个映射。哎,映射啊,这个或者换句话说呢,我们说函数本身就是一种映射关系,对吧,大家上中学的时候呢,都学过这个映射,左边一个集合,右边一个集合,左边一个集合呢,我们称作自变量构成的一个集合啊,某一个元素啊,按照某种对应法则映射成啊右边这样集合中的一个元素了,那如果说每个元素映射的这种规则都是一样的,其实我们就可以用一个函数来表示,也就是说呢,函数是一种特殊的映射。
08:03
啊,那我们这儿呢,需要传呢,就是一个函数,那自然而然的是不是需要传个函数嘛,自然而然的,我们这个方法呢,其实就相当于代表了一种映射关系啊,由前者呢,映射为后者,前者映射为后者,OK,那么一说到这个映射的话呢,大家可能会想到什么呢?就是我们在讲JDK8的时候提到过这个新特性啊中的呢,叫做a stream API,在stream API当中呢,我们提到过这个映射啊,叫做map。这个操作啊map呢,其实也相当于是一种映射了哈,当然我们讲完这个映射之后呢,后边还提到一个规约叫做reduce操作了啊map reduce,这就是大数据当中呢,我们说先映射后规约啊这样的操作了,那其实我们这里边这个transform呢,就跟咱们stringpi里边这个映射map方法呢是类似的。啊,是这个意思啊,那么咱们再举个例子,让大家来感受一下这个相似的情况。哎,这个我还是叫写个二啊。
09:02
好了,那么这里边我们把这个例子呢,直接拿过来啊。CTRLC。啊,这我就粘过来了,看一下这呢,我们是测试一下这个transform操作,呃,首先呢,我们创建了一个list,这个list我们是通过list调了一个O方法,这呢也是我们后续这个之前提到一个新特性哈,是JAVA9当中提到的,呃,生成一个不可变的一个集合,呃,Java Python c加加。好,那么得到我们这个list以后呢,我们这个接下来你看我做的这个事儿啊,呃,LIST1我们第一个for方法里边呢,需要传一个接口,这个我们叫做consumer啊,消费型的一个接口啊,函数型接口,那这呢,我们把相应的这个element,也就说这个类一当中的每一个元素呢都传过来,传过来以后的话呢,我们把这个元素诶先呢做一个,诶注意这个呢叫呃,String方法。这个方法的话也是一个新方法哈,是JK11当中新添加过来的,这个方法类似于咱们的,看上面有没有说哈。
10:03
他没有说做一个替换哈,这个方法呢,跟我们以前的这个tri方法,就我上面调的是类似的,都是去除前后空格,只不过呢,这个tri方法呢,是遵照了新的UNO的这个标准了,它呢,呃,对这个特殊的一些空格的展示情况呢,是也可以去除的,这个trim呢就不行啊,比较老的一个方法啊。哎,当然呢,以后可以使用我们这个trip trip啊,进行一个前后空格的去除啊,这呢就相当于是把我们的元素做了一个映射,呃,去除前后的这个空格啊,大家看到我们这儿本身呢,是存在一些空格的啊。行,那么去除完空格以后,再接着呢,把它变化成一个大写的,然后呢,再针对于像我们的这个Java啊,或者这个Python,呃,前边呢,给它加一个hi。哎,作为一个新的元素,依次添加到我们这个例二当中啊,然后对例二呢,进行个便利操作来跑一下,看看这个结果呢,是不是大家认为的这个啊,就是你能理解清楚这个过程啊。能理解吧?
11:01
这时候呢,我们这个Java没有了,像这个Python前面的包括C加加,前面后边都有空格,我们把这个空格呢,也做了一个去除啊,表换成大写了,然后呢,前面又补充了一个氦啊,这就我们输出的一个情况是我们LIST2里边的一个三个元素,那这呢就能够再进一步的去大家体会一下transform的一个使用,那么这个操作呢,大家想想你能不能把它改写成我们JAVA8当中提到的map方法。啊,做一个映射操作。这个我粘过来,这呢是一个三。来,我们一块儿来写一写啊呃,首先呢,这块呢,跟我们原来是一样的。还是这个LIST1对吧,然后呢,我们通过这个LIST1先去调一个stream方法得到呢,我们相应的这个集合构成的一个stream,然后的话呢,我们需要做一个映射。啊,作为映射,那内部呢,我们这个元素不妨我就写成一个word了啊,这个元素我们需要传入的也是一个函数,嗯,先要做的事呢,跟上面一样啊,去除前后的空格啊,那我们就直接我就不调这个叫方法引用了啊,我就调一个叫诶strip方法。
12:10
啊,再点我们再去调一个map方法,这呢map属于我们string API里边讲的这个叫中间操作,中间操作呢,你可以执行多个啊,呃,再接着我们再拿这个word,呃,再执行一个叫做to up case啊这块我们就可以,呃,其实前面一个也行啊,用这个方法引用跟那个一样啊,我前面一个只不过没有写而已,这个我们就一些方法引用吧。哎,然后再去调用一下这个map方法。那此时我们要做的事,哎,就跟我们刚才上面这个也是一样啊,其实上面这个呢,呃,小括号这个也可以去掉,因为它只有一个变量嘛,啊可以删掉啊,那这呢,我们是一个word,哎在前面呢,给它补上一个这个我们叫hello吧。诶这样个情况好,那这块呢,我们来一个al enter,诶返回对应的一个叫stream啊,我们就叫HR的一个stream行,那我们把得到这个stream呢,给它对应的生成一个新的list啊,Itr的一个stream,第二诶我们可以调它的一个方法叫做collect方法,这个我们去调一下叫collectors,诶,To list。
13:18
哎,这样就可以了,Al enter生成对应的一个啊list这个我们就叫做LIST2,这个LIST2呢,其实跟我们上边LIST2呢,我们说得到这个内部的数据啊,其实是类似的啊,诶我们接着呢,也去调一个forage的方法跑一下看看啊,刚才呢,我们执行的一个结果,大家再看一看。是这样子的,那我们现在来看一下,我们当前这个操作呢,跟上边一个是不是一样的。哎,看到了是吧,哎,除了我们这个由hi改成hello之外呢,其他的其实都是一样的。好,那也就是说呢,我们呃,针对于这个原来的集合或者数组呢,调stream进行一个映射操作,那如果我们对这个字符串呢,进行一个独立的一个映射的话呢,其实大家呢,就可以用这个叫诶transform这样的方法,应该说是比较方便的,好这呢,我们提到叫transform的方法,然后下边呢,又提到另外一个新的方法啊instant,哎,我们看一下啊。
14:16
呃,Inent啊这个方法,这in方法呢,是实现呢,能能够调整我们string实例的一个缩进啊,这呢,咱们直接就把这个代码呢拿过来啊CTRLC。那这个是我们中的一个方法。好,Test Internet这块,我们生命成一个public的。把它呢生命成一个单一测试方法。好看一下啊,这儿呢,我们是有一个字符串,呃,虽然说我这块使用的这个叫换行符了啊呃,这个字符串,这个字符串这个符串,或者我们先整的简单一些吧。我们先用一下这个操作啊,Java c加加,然后呢,第一个证的方法,前面是一个三,我们来看一下结果。
15:08
呃,Should not bea static啊,这块我们把它生明成静态方法啊,去掉单元测试方法不能是静态的啊,刚才没注意到。好可以了,那我们输这个结果有什么特点呢?大家会发现呢,我们Java c加加呢,前面会有一些空格啊,这里提到有三是吧,123啊这呢就是我们前面有三个空格,那如果把这个改成四呢?哎,相当于我们这个结果当中就会。哎,有四个空格。啊1234啊这样四个空格,所以呢,这个int的方法呢,就是前面加空格的意思啊,就是这个意思啊好,那么我们把这个事儿在CTRLC拿过来,我们中间有这个这个这个换行符啊。那现在呢,又是一个什么情况呢?这样咱们就是让它表示一个换行的意思,看跟我们这个题目呢,是不是一样的啊。
16:03
哎,我们整个再重新粘一下吧,CTRLC。那这样子哈,好再跑一下。来大家看啊,首先呢,我们这个Java前边呢,诶看看是不是三个一个两个三个没问题,然后呢,你会发现呢,我们后边的换行以后呢,这个Python和C加加呢,每一行数据前面呢,都会增加一些空格,这个C加呢,前面当然也是三个了,呃,那对于Python来讲,本身它就多一个空格,所以呢,你会看到诶首先把这个空格补完,然后呢,再往前有三个。那也就是说呢,如果我们这儿呢,是一个没有换行的字符串。没有换行的,那就是在它前面呢,相应个数的这个空格,那如果你要有换行,那么每一行前边补相应个数的这个话,这个空格啊,这就是我们说这个证的这个方法。呃,这个方法呢,我们点开看一下,也是在我们JAVA12当中新增加的,这呢就是我们关于这个string啊,在JAVA12当中提到两个新的方法,诶关于源码呢,这我也粘过来了啊,大家有兴趣的可以看一下。
17:08
好,这个我们就过了。
我来说两句