好了,我们继续说常用类,接下来我们要讲常用类中的字不串相关的类啊,这个相当相当的常用啊。当然到到此为止,咱们讲所有的知识都是常用的。这个所以我这是一句正确的废话。 那么此经历呢,是什么呢?代表不可变,自古序列啊。然后呢,这个 然后这个 spoon beauty 代表的是什么?还有一个 spoon buffer 代表的是可变字符序列,它呢一个不可变,一个可变 啊,那么都很常用啊。然后呢,可变还是不可变。核心的问题是原码里面有个叫翻斗的东西啊,这给大家做的图片啊,都是翻斗的锅,一会咱们可以 给他看看原码。然后呃,这三个类呢,当然当然要掌握好了,用了太多太多了,是不是他们底层呢?当然都是 u 内口的磁伏级了,都是 u 内口的子伏级。 那么首先我们看看 ctrl 类的,它为什么不可变啊?它的圆码里边,大家看这圆码 class trend 里边,圆码里边有一个什么 provided final chair, 这就这样的东西。 我们可以看到他是一个千二数组,他就用来存我们的自助训练,我们的自助训练全都是在这存着。但是呢,他是什么?是翻译动物,就意味着什么呢?意味着只能初次化一次。 那大家也可以想象的到,如果四川 biu 的呢,四川 biu 的里边就也是他,但是呢,他没有烦恼,我们可以随便改变。好吧,就他俩就是核心区别,就是这个区别。呃,我们当然也 也可以打开我们的原网看一看啊。 关于尺寸呢的,这个 我们之前呢讲过这个尺寸的这个一些常用方法,这次我就不讲了。这次呢尺寸主要是陪衬啊,陪衬一下 stry bill 的个 stree 八号来,大家看 好,打开它,我们上次看过了,看看原码,大家可以看到就这个 private final chair value 是吧?然后呢,呃,我们的往里传直的时候,大家看 this is their value 等于什么?什么 value? 看到没有?都是往这里边放。 ok, 然后呢,这是一点,还有几个小要点,大家注意一下。常用的方法就不说了,这些使用的方式我也不说了。还有一点是什么呢?像这个萨布斯圈,像这样的方法我们今天也讲过。呃,他都是返回的新字母串 截,截取图串,咱们上次不是讲过了吗,对不对?截,看起来把它截出来了。截完之后呢,返回的什么?返回的也是新字母串,老字母串是不变的啊。比如说我们找一找三部曲, 然后大家看,呃,看哪个都一样了。大家看这个萨布斯群是不是 水特六啊,是不是六一个碰见了个心思,不知道返回看到没有。如果你结的时候呢,是从零开始结,结到最后,那就是那就把自己返回去 对吧?如果是结的其他位置,返回新四部分,看到没有啊,这个也是一样的,这是一个公仔的方法啊,反正最后呢也是返回的什么六字啊,无非是什么啊, begin 所有位置从零到结,到最后才返回本身,要不然返回就是新四部分 好不好。所以大家可以通过圆码就可以知道他的一个原理了,所以他是不可变的啊。好。然后呢,还有一点呢,大家一个小细节,大家注意一下,这个我就不不测试了,大家知道就行啊。 呃,变异性呢,会经常会对这个字母串连接呢,做一些优化啊,比如大家看这个哈喽扎瓦啊,中间有加号连接起来。那么变异性变异的时候呢,他会什么呢?直接把它拼接起来,像这种情况会拼接,直接拼接,为什么拼接为他 是吧,所以呢他他俩是相同的对象。但是大家看像这样的就不对了。扎尔,哈喽扎尔他俩呢三跟四,然后呢在 变量这运行啊,他不是这么直接拼接。那这种情况呢,我们的边缘器就不知道,不知道边缘他他只认只认识他,他里边什么值,我是不知道的。变异器,所以呢,这个这种情况他没有拼接,这种直接加的时候呢,他会拼接好不好。所以这个呢是返回的是处,这个呢,返回的是 fouse 啊,这个大家注意了解一下。好吧。所以这次呢,主持人类呢,主要做陪衬啊,看看原码,大家呢把他们三个放到一起,是告诉大家 三个都是自负的相关类。然后如果大家忘了四顺怎么用了,怎么用了,回到咱们之前讲的那个地方,把四顺那常用的方法再过一过啊。
粉丝5147获赞2.8万

只要把一分钟判断 three 类型的值是否相同,判断基本数据类型的值的时候,一般会用两个等号进行判断, 运行可以看到返回的值是 true。 但是在判断两个字符串是否相等的时候,假如我们依旧使用两个等号进行判断,可以看到运行的结果为 force, 但实际上两个字符串是相同的,因为两个等号比较的是字符串的内存地址,所以要使用 equals 方法进行比较, 运行后可以看到接 果为 two 判断成功。假如两个字符串大小写有区别,但是比较的时候想忽略大小写,这时就要调用 equals ignore case 方法, 运行后可以看到判断结果为 two。 判断成功,你学会了吗? nice!

java 一分钟判断 string 类型字符串中是否包含指定字符?首先定义一个字符串, 然后调用 contains 方法。方法中传递的参数就是要判断是否存在的字符串。 现在是判断字符串对向 a 中是否包含 world, 运行后结果是 true, 也就是包含。但是 contains 方法中的参数是区分大小写的,如果将大写的 w 改成小写的 w, 运行的结果就是 false。 另外,我们也可以判断字符串是否已指定字符开头或结尾。 stops with 方法是判 断字符串是否已指定字符开头,这里是判断字符串对象 a 是否以 hd 开头, 运行后结果为 drew。 也可以调用 and sweet 方法判断字符串是否以指定字符结尾,这里是判断字符串对向 a 是否以 d 结尾,运行后结果为 drew nice。

今天我们来聊聊读源码的方法,那我之前我读过 spring spring boot, spring cloud, my bat is tom cat to keep a double riber mcque rocket mcque ninjas 内核, windows 内核,苹果操作系统内。 了不起是因为我之前的工作就是基于 supreme 的开源项目去做一些二次开发,所以被迫读了一些原码。 当然读原码也有很多的好处,比如说今天我们就来给大家分享一下我之前读原码的一些方法,希望对大家有用。 方法一,读原码前必须全面熟悉该框架的所有功能。方法二,读原码前必须分清主次,识别什么 才是真正的核心流程。方法三,读原码过程中多多利用原码调试技巧和工具,比如条件断点法、断点数元法、修改原码法、注释法、常用工具。 方法四,读圆码过程中善用猜测法,增加趣味性。方法五,反复反复再反复。 方法一,我们在读一个框架的源码之前,一定要先全面熟悉该框架的所有功能,那我们通常会在简历上写, 熟练使用 spring, 熟练使用 my betties, 熟练使用 spring boot 等等。但是我们真正的把 spring 它所有的功能都掌握了吗?我们来看,比如仅仅就在 spring from work 中间,我们就有一百一十 五个注解,那么这其中还不包括 spring boot 它相关的一些注解,那么我们真正在工作中间能够用多少呢?顶多五十个注解,那还有一大半的注解其实我们都没有用过, 所以 spring 中间的一个注解其实就相当于一个功能, spring 框架的原码就相当于在实现这个功能, 所以呢,就像我们入职一家新公司一样,我们要去掌握这个项目里面的代码,那么我们就一定呢,得先去熟悉业务,你才能够读懂那些代码,所以读框架的原码也是一样的, 在读约马前,先尽可能的全面的掌握该框架的所有功能,再去读约马,这样子能够事半功倍。方法二,在读约马前,一定要分清主次, 先读主流程,再读分支流程。关键是什么是主流程呢?啊?我们读 supreme 语言嘛,到底是应该先看 supreme 容器的启动流程,还是先看配置类解析流程,扫描流程并实力化流程,并依赖注入流程,还是 aop 流程等等等等?哈哈哈 哈哈哈哈哈,好,这个时候其实我们要从这些流程中间跳出来,然后去思考一下 spring 它真正的核心是什么? 我们 spring 的核心其实是并那么一个并对象到底怎么创建出来的?这其实才是 spring 它真正的核心流程。所以我们应该先要读的就是 spring 它是如何去创建一个并的这个流程的原码,而不是 spring 启动的这个圆满。而且对于 supreme 容器的启动过程,它实际上就是在为病的创建去做准备。 所以我们在熟悉一个框架的所有功能之后,哎,认真去思考一下,认真去总结一下,去理解一下到底什么才是主流程,再去读他的原码,这样子也会让大家少走很多很多的弯路。 nice! 方法三,我们在读原码过程中啊,多利用一些原码调试技巧和工具。 好,第一个方法,条件断点法,比如在我们思维原码里面有一个度 ctrl 并的方法,这个方法就是用来创建一个并的方法的实现,那呃,我有的时候我们需要去看我们某一个并他是怎么创建的,就需要在这个方法里面去打断点。但是如果说我们就是这样子去打一个断点的话,那么这里就会发现你在调试的时候会禁很多次这个方法,因为 我们通常一个识别容器里面会有很多很多的病,比如说现在创建就是这个病,然后你紧接着去下一个就是下一个创建的病啊,这是下一个创建的病。但是有的时候我们只关心 user 这个病是怎么创建的,那么这个时候我们就可以来使用我们的条件断点,比如说你可以直接去利用当前这个方法里面的一些 入场,包括一些局部变量之类的,都可以去设置相对应的条件。比如说 bin 等于 u 的设备时,这样子我就设置了一个条件断点,那么这个时候我们再来第八个的时候,进到这个断点的就是符合我刚刚所设置的条件 bin 等于 u 的设备时,这样子我们在调试的时候就会更加方便一点,并且能够更加精确的去定位到一些问题。 第二个方法断点溯源法,还是拿 supreme 来举例子,比如说我们这是一个并,那么这个并肯定 supreme 就需要去创建这个并对象,那么我们创建一个并对象肯定得用到当前这个类里面的购置方法去创建。那么我们现在要去研究 supreme 它是怎么去实地化这个并对象的,那么我们就要去找到 supreme 原码里面它在哪个位置去调用呢?当前这个类的购置方法,那么如果说在我们对 supreme 原 不那么熟的情况下面,你该怎么快速的定位到他在哪个位置去调用呢?我这个购置方法呢,其实很简单,你可以直接的把这个补偿的购置方法明确的写出来,然后在这里面稍稍的去写一些些代码,然后在这里直接打一个断点,可以这样子我们去 dbug, 最终只要代码进到了这个位置,那么你通过他的这个调用站,你就可以一步一步的去找到,比如说 当前购置方法在这里调对,然后去找找,找找,很明显我们发现这就是 swind 原码了,那么很明显 swind 他就在这个位置哎,会去调用我的那里面的购置方法去得到一个对象,从而你可以再往上面找。那么他到底是怎么调过来的?你可以一步一步的在 去找,比如说很明显在这个方法里面会去进行实力化,然后再往下面走,哎,会在这个 correct 并定审时,这个方法里面会去进行实力化,对不对?然后再往上面走,你会发现又回到了我们的度, 为了病这个方法里面会在这一步去调过这个方法,然后去使力化,这是我们说的断点竖圆法,就是一步一步的往上,或者说你这边往下去找都是可以的啊。明白我的意思就可以。第三个方法修改原码法,当然这个方法就需要你把你想要看的框架或者说中间建成圆, 把它给下载下来,然后把它编译好,能够正常的运行。就像我现在给大家看到的,我们可以在原码上面去写注式,包括我还可以去修改这些原码,我都可以去改动的,对不对?所以说有了这个技巧,虽然这也不算技巧啊,只不过呃对于大家而言可能前提啊, 准备工作要做一些啊,你才能够去修改它的原码,一旦你能够修改它的原码,那就很方便,那么你就可以去进行各种各样的测试,或者说啊一些验证啊,让自己对这个 supreme 的原码有一个更加深刻的了解。所以说强烈建议大家把真正的这个框架的原码把它下载下来,然后自己去把它编译好,就不要去利用 ida 的那种反编译的 一些代码,直接去看他那些代码,因为你虽然啊也是能够看,但是你不方便去写一些注释或者去修改一些原码,其实呃也也是影响大家看原码的一个效率。 第四个方法就是注释法,我这里说的注释法一方面是我前面讲的在源码上面去写一些自己的注释,另外一方面就是源码他本身所提供的这些注释一个方法或者说某一个类上面他其实都很详细的写了很多的注释, 像通常这些开源框架他是需要让很多人共同去协作的,所以呢他自然而然他这里注视都会写的非常详细,而且会保持更新啊,也是让开源社区的开源人员跟着开发者能够很好的去持续的去做这件事情,就是对于大家而言也要努力的哎,花点时间把英文稍微学一学,然后呢让逼迫自己去看懂他们的这些注视,其实这些注视对于我们 加法开发人员来说其实并不难啊,虽然是英文,但是里面里面很多东西你一眼都能够明白谈什么意思,只不过大家要强迫自己呢,多去看一看。 还有一点就是官网, supreme 的官网呀,朱 ever 官网呀,其实他们都提供了很多很多的呃,一些底层的一些原理上面的一些解释啊,所以呢,官网也是大家要多多去看一下的,就不要老是百度或者 csdn 上面去看一些文章啊,有空的时候直接去看一看他的官网啊,相信对于大家来说也会非常有收获的。 然后就是一些工具啊,其实我在看原码的过程中间我并没有用到太多的工具啊,比如说有人说要翻译,我就是用的有道云啊, 比如说有时候要画图啊,就是用的 processor 啊,比如说有的时候要写一些总结性的一些笔记,或者是用的语券啊,这三个。然后呢,其实最重要的,我个人觉得最好的一个工具还是 ida 的最新版,当然我当时呢是下的最新版啊,比如说我现在的用的版本就是二零二一年的这个版本,二零二一年一月吧,刚刚看到的是 二零二一年的一月一点三这个版本看到没有那么呃呃,关于啊这个最新版,比如说他就有一个功能,就像这个功能,哎,大家发现没有,就是如果说稍微老一老一点版本的 ida, 你的注视肯定长这样的,那有的时候我们确实想要去翻译一下,你要复制一下这段话,但是我们一复制,其实你把这些 p 啊,对不对?还包括把这些新号你都复制过去了,那么我们知道你要翻译的话,你得把这个又又得把他给删除掉,就很不方便,对不对? 你看现在新版的 ida, 他就提供了这么一个功能,自带的哦,他可以直接的相当于进行格式化。哎,这样子你再去复制的话,其实很方便,看到没,你直接复制一下,然后再去翻译就没,不需要去进行多余的操作。而且这样子你你去看啊,你官方自己直接去看这段英文注视的话也会比较方,方便,明白吗?所以说方法是 猜测法,这是一个非常重要的功能。我们在读一个功能的源码之前,我们先停下来思考一下,假如我是 supreme 语言码的作者,那么我现在的银行卡里面有几个零呢?想错了,就是假设我是 supreme 语言码的作者,我会如何去实现这个功能? 有了自己的一个思路之后,我们再去读真正的 supreme 圆满,你会发现惊喜,要么你会发现你和 supreme 圆满的作者想的是一样的,这个时候你会非常开心,要么你会发现你和 supreme 圆满的作者想的是不一样的,这个时候呢,你会非常的好奇, 这样子我们读原码,他就变成了一件非常有趣的事情,就不再枯燥了。方法五,反复反复再反复。我们很多的框架或者说中间键的代码 都是经过了很多年沉淀下来的啊,不管是 spring 还是 tom cat 还是猪 keep, 他们都是十多年二十多年所沉淀下来的,代码量很大,版本也很多,所以就算我们掌握了很好的方法,也是需要我们长时间的去琢磨,去坚持的。 其实读员嘛,就像看到一个丑八怪啊,你可能一开始觉得他会非常的难看哎,但是你天天看天天看,时间久了之后你就会慢慢的接受他,你就会觉得他好像也没有那么难看。最后我送大家一句话, 一入猿马深似海,从此秀发是路人。如果喜欢我的视频就请点赞点赞点赞。如果期待我的视频就请关注关注关注,下期见。拜拜。

我们程序员最害怕的就是去看别人写的元代码,那今天用这个网站的话,效果简直爽翻天。那我们点击地图的话进去,然后随便查看一个流程,在这里的话,点中一个节点 i f 三的话就可以查看他里面的元代码,点击下个节点的话,我们就可以查看下一个节点的元代码,这样的话一步一步点击,就和我们的第八个过程是非常的一个类似的。 此外的话我们还可以直接去查找某一个类,直接比如说 best execute, 然后再去查找它的里面的一个方法, 然后右键点击查找关联,用力点击虚线,查找他的一个详细路径的话,这个和我们的导航是不是非常的相似,他把你 帮助你把整个完整的执行过程的话给他展示出来了。另外的话我们还支持这个多线层的一个展示,比如说我们查看一个 double 的一个调研过程,在这里的话这个实线就是他的一个主线层,然后虚线的话是他表达的一个分制线层。另外的话我们还可以查看这个项目里面那个元代码,包括他里面那个第三方依赖啊和这个驾包的一个依赖。然后我们还可以 进行一个搜索,比如说搜索这个 spring 非常的方便。这个网站的话目前来讲比较的一个新,所以说百度还不找不到啊,那么这里的话,大家只要输入这个 code read 点之前就可以进来。

来跟大家分享一个美团的面试题,请你详细说说对试卷中编程方法的理解。好,那么我很,我相信很多同学应该是呃认识这个方法的,有的可能也看过这个方法上面的一些注视,对不对?我们这里又不去读注视,我们直接来 拿 demo 来给大家去深入的去讲一下该教程所涉及到的资料原码笔记,大家可以联系 up 组或在评论区领取。好,大家看啊。首先大家可以自己读一下,像这目前的这里的代码,他会打印出来什么东西,比如说 dr 代码,五六的一个死菌啊对象,然后里面传了一个支付串幺幺, 对不对?然后调用的 s 一的英特方法,然后 s 二,然后呢?这是 s 一啊,就是呃,就是呃幺幺, s 三,好,那么呃,大家可以自己就思考一下,比如说 s 一等不等于 s 二,哎,对, s 一等不等于 s 三, 大家可以自己把答案说出来,那么 s 二等于 s 三,好,我相信啊,很多同学可能就是这么来分析的啊,我,我带大家来分析一下啊,可能很多同学都是这么分析的,我们来看啊,首先呃,我们知道这里这一行代码其实其实是溜了两个对象,一个就是我们的石俊对象,一个是我们的 就是支付串,这么一个对象对不对?好,那么就相当于在呃,我们的里面啊,会是这样的一个情况,那首先就有一个死菌对象对不对?那有一个死菌 对象在堆里面,那么这个对象呢?其实我我我把这行代码,把,把这三行代码把它复制过来,这么给大家来讲啊,第一行代码死菌对象,然后有个幺幺字符串,那么就相当于在我们的字符串长相池里面啊,还有一个字符串幺幺,是这么一个情况,对吧?好,那么这是我第一行代码,我虐了两个对象。好,那么我, 我的 s 一是谁呢?呃,我的 s 一,他其实存的啊,就是他。对,当然我们可以呃,用这个线头,或者说你要知道这个地方其实存的就是史俊对象的引用地址,对,就是 s 一这个地方其实存的就是史俊对象的引用地址啊,我们先呃,就不画不写吧。好,再来看。那 s 二,那我们先看啊, s 一点监测。 呃,英特英特这个方法,其实你去看他上面的注视,他是没形容的,就是当你一个试军对象调用这个英特方法,那么他会先去检查一下字符段产量词里面 有没有你单线 s 一,你所对应的这个,呃,试军对象的值,那你看啊,我单线 s 一,我调了音,非常方法。哎,那我发现知不道闪亮值里面 有这个字符串,那有这个字符串他会怎么办呢?他就会直接把这个字符串所对应的这个对象的引用地址返回给 s r, 就是当做这个方法的返回值嘛,那也就说 s r 他指向了 就是这个对象,也就是 s 二里面他存的就是这个制服创对象的。呃,由腻子存在热量,那么 s 三啊,他直接就是用的一个字面量啊,那么 s 三,很明显他对应的也是这个制服创 对象,对不对?就说根据我们的答案,我们来看一下, s 一他其实不等于 s 二, s 一也不等于 s 三跟 s 二和 s 三是相等的,所以说回到我们甘大吗?我们来跑一下,就说这里应该是 force, 这里应该是 force, 这里应该是 true, 对,我们来试一下啊, 好,我们发现确实是的,就是 force, force to, 对,好,这是我们呃对于这段代码的一个分析啊,那我们紧接着来看下面这段代码。好的,我不知道上面这段代码大家听明白没有,听明白的可以打个一好吗?好,那么再看啊,那下面这段代码其实我的其实差不太多,这边左右 第一行代码的区别,我们刚刚第一行代码是直接溜了一个死菌对象,然后传了一个字母串,对不对?那么我现在干嘛呢?我是把一个数字转成了一个死菌对象。对,注意, s 一他现在指定的肯定仍然还是一个死菌对象。对,那么我们也可以来换一下,把这三行代码, 把它复制过来,然后看一下这里的答案,大家其实也可以自己思考一下来,比如说目前这种情况, a 十一等不等于 s 二。对,哎,你看啊, a 十一我说了它指向是一个死君对象,那 a 十二到底是什么呢? 哎,有人说,可能想想到 s 一你这个死于对象,你遇到英特办法,那字符算产量里面是没有呃,就是字符算幺幺的。 对,那么他会干嘛呢?他按照我们的理解,他应该就会把呃你 s 一的那个幺幺这个字符上,把它放到字符上产量里面去,然后把呃那个对象给呃返回,对不对啊?然后这里 s 一 这个更假,但是这很明显就是一个呃字面量的支付串。对,那么很明显啊,我们的 s 一,至少 s 一和 s 三应该是非常准的,这是我们的理解。对,对,我们当时我们来试一下。啊, 好,你会发现这两个他返回的都是 q。 好,那这是为什么呢?你 s 一怎么会和 s 三是相等的呢?好,那就这样子我们来分析一下啊。 呃,其实还是这样子,因为这个跟具体的 j d k 的版本有关系,因为我现在用的是 j d k 八啊, j d k 八和 j d k 七,呃,是,就这一块它是没有大大的区别的,但是 j d k 七和 j d k 六关于这个 inter 方法,它的底层的实现是有一些区别的。好吧,我们可以先来讲我们比较熟的啊,就是如果说你是在一点六里面,那么对于这三行代码它的执行其实就是大家所理解的。比如首先我第一行代码我略了一个, 我就相当于生成了一个死局对象,然后 s 一就是像他这个时候字符上产量尺里面是没有字符算幺幺的。对,因为你这里不涉及到那个字符算幺幺吗?好,那紧接着我调用 se 的英特方法,那你只要调用这个英,呃,英特方法,那么就相对调用这个对象的英特方法,那么他会干嘛呢?他会去判断字符上产量里面有没有幺幺? 注上摇摇,哎,发现没有?没有,干嘛呢?没有我就会在这里面给你去生成一个。好,生成完了之后我还会就把你这个对象的引用地址给返回。所以说在 gdk 一点六里面,我们的 sr 是指向了这个对象, 这个和我们刚刚就是这种理解是能够理解的,我相信很多同学估计都是这么理解的,对不对?但是我说这是 jdk 六,里面是这么理解的,是这么做的好,那么同样的道理, s 三啊,你直接就是指向摇摇,那么哎,就这个对,就是如果说我们这么理解的话,你 a 十一肯定不等于 a 十二, a 十一 也肯定不等于 s 三,对,但是现在我们跟代码跑了,没发现他们两个都是相等的,他们三个都是相等的,相当于对,那么他们到底怎么做的呢?那是这么做的,就在一点七之后是这么做的,怎么做的呢? 好,首先我还是第一行代码,那我第二代第行代码我就只生成了一个四军对象啊,这个没别的啊,主要看这个英的方法,英的方法他其实也会去判断,哎,你这个字符上产量词里面有没有幺幺?发现没有没有,会怎么样呢?来,注意,不是直接存一个字符上幺幺存进来,而是存你这个对象的引用地址, 先把这个引用地址啊存在这个地方好吧,并且他还会往这个引用地址返回,就是会把当前这个时间对象的引用地址,也就是我们 s e 的引用地址当做这个 inter 方法的返回值。这里我不知道能不能理 解啊,就是说他并不是返回的这一块内存的地址,返回 s r, 他是直接把你这个死俊对象的,就这个对象的应用地址,其实就这块东西直接返回 s r 的地址啊,这一块内存的地址直接返回给了 s r, 就这个意思,所以说相当于 s r, 他其实也是指向了这个对象,那么 s 三,当你呃,想要去用这个字符串幺幺,那么一样的他也会先去看字符串产量尺里面有没有字符串幺幺,虽然我这里没有真正去纯字符串幺幺,但是我存的相当于存的 幺幺。这个石俊,呃,这个算对象的一个引用,我算这里了,所以说 s 三其实他会发现也已经存在了,所以他也会把这个石俊对象的一个例子返回给 s 三,所以说最终你 s 一也好, s 二也好, s 三也好,其实都是指向的统一一个对象,所以这是在一点七之后他这个 inter 爸爸里面的改变,所以这个大家,呃就是需要注意的一个点了啊,所以当具体的细节啊,因为我们面试题嘛,就呃讲到这里,大家如果说你想更深入的去了解细节的话,大家可以看一下呃,美团技术博客里面这些,这这篇文章啊,他分析的 非常非常细了啊,所以,呃,本视频我就讲到这里,好吧,还是希望大家至少知道这么一个点啊,到时候面试官再回答你这个问题的时候,也不至于就还是回答的比较老的呃一些,呃,底层原理好吗?好,所以就讲到这里,希望大家有所收获。

接下来我们来学习尺寸内的构造方法,我们前面在看帮助文档的时候就知道尺寸内有很多构造方法,这里我们只选择几个常用的构造方法来学习,这几个是要求大家能够掌握它的使用的,来我们看一下啊,这个是 使用无餐构造方法来创建一个空白字符上对象,它不含有任何内容,那么这个是使用一个字符数组的参数,根据字符数组的内容来创建字符上对象,那么这个是 给一个字结数字的参数,根据字结数字内容来创建字幕上对象。最后这种方式其实并没有使用构造方法的方式,而是直接给一个双引号扣起来。 abc, 这是直接复制的方 方式创建支付串对象,他的内容就是双要扩写内容。 abc 好了,这就是我们说的几种常见的获取支付串对象的方式来 说完之后我们到代码中演示一下,打开我们准备好的加瓦文件,里面有这几种方式的注视信息,接下来我们分别来演示一下,先看第一个 ctrl c, 然后我把它放到这里,我们来创建一个对象,死春影, s 一等于又一个死春影,这次使用的是无餐构造,所以不给任何东西, 那么现在这个 s 一就已经是个对象了,怎么来验证呢?很简单, s 一点,大家看我点完之后有很多方法可以让我们来使用,这些方法都是死去内中的, 所以我们说他就是已经是个对象了,那么针对这个对象,我们现在不做调方法操作,而直接做一个输出,认真看啊, s 一冒号加上 s 一。 好了,右键执行,来看一下控制台的输出,控制台没有输出任何内容,也没有输出地址值那样东西,那说明这个对象他如果输出的应该是他的内容,只不过他里面没有内容而已。 接下来我们来看下一个 ctrl c, 把它拿到这里,这里是根据字符数组内容来创建字符上对象的,所以首先我们得有一个字符数组大括号,我给几个字符,哎 b c, 好了,有了这幅数字之后,我们来创建对象, stean, s 二妞一个 stean, 他要的参数是一个自负数组,所以这里我传一个自负数组就可以了。那么最后 s aut 一回车 s 二码号加上 s 二来认真看一下啊,右键执行, 控制台输出的内容就是 abc, 他是根据字符数的内容来创建的字符串对象来。接着我们再往下来看第三个 ctrl c 扔到这里,死蚯蚓, s 三等于六,一个死蚯蚓。发现问题来了,他要的是个 什么字结数组啊?所以我首先得有一个字结数组,那么就是 bux 等于大括号,那么字结数组什么样子呢?字结它也是一个整数,所以这里嘛,我们给几个数据,就是七 九十八,九十九。好了,字结数组有了之后,接下来把这传上字结数组就可以了。最后 s o, ut 一回车 s 三,冒号加上 s 三。来我们看一下这次输出的什么,右键执行,控制台 输出的还是 abc, 那这个怎么理解呢?来我们说一下,我们前面说过了,九十七,他对应的底层的字符应该就什么,就是 a, 也就是 a, 这 个字符在计算机底层存储的应该是什么数据?九十七这个值,而我们右键执行是把这个值拿出来让我们看到,看的时候其实他又把它转成了一个字符,什么字符?哎, 所以现在这个九十七、九十八、九十九,他对应的字部串中的字符就是我们的 abc 这个东西。 好了,说完这个之后,我们来说最后一种方式,注意最后一种方式他是没有使用构造方法的,他是直接负值,那么 stys 四等于 abc, s out 一回车, s 四冒号加上 s 四,写完之后来右键执行这一次再控制台输出的内容也是 abc。 好了, 到这这几种方式得到字不算对象,我们就说完了,这里我们写一个推荐,推荐 线,使用直接负值的方式得到字符串对象,也就是说虽然前面这几个方式我也讲了,但是我还是建议使用这种方式。 好了,到这关于字符串的构造方法我们就说到这里了,我把这停掉。

我们首先来看一下当前这个牛死俊创建了几个对象,接下来再看一下,这么写的话,这个牛死俊又创建了几个对象,接下来就一起探讨一下,这里当然默认是关闭逃逸分析的, 所以说第一种这种写法的话,牛斯俊他是创建了三个对象,跟你想的一样吗?这种写法的话,牛斯俊他创建了两个对象,接下来一起分析一下答案。 第一种写法的话,系统首先会去自负串尝尝吃里面去找有没有思政这个对象,如果发现没有的话,他会先溜一个思政对象,然后也会创建一个查数组对象, 插数组中存储的就是我们的 abc, 然后返回 string 对象的引用,给 string tab 字符串长量持在 ggvm 层面的话,它其实就是一个 string tape 的结构,它主要用来存储字符串对象的一个引用。 我们一般说一个自负串进入了长量池,其实就是说这个 string tebro 中保存了对这个自付串的引用,反之如果说没有的话,那就是 string tebro 中没有对它的引用。 这个时候就已经创建了两个对象,一个死军对象,一个差数组对象。接下来才是创建我们真正你有死军对象的这个对象,他在堆上创建一个死军对象,然后他自己的差数组会指向慈福串敞亮池中差数组,然后返回在堆上, 嗯,你有 string 对象的引用给占上的 abc 变量。所以截止目前为止,是不是创建了三个对象,一 个死菌推波指向的死菌对象,一个查数组对象,还有一个我们自己扭的死菌对象,这种写法的话,扭死菌上面的内行代码,就好比已经提前在自助串长凉池中创建好了对应的对象, 就像上图中红框中框出来的四准对象跟差数组对象,所以这种他就只会扭一个我们自己的四准对象,并让自己的差数组指向走船产量持重的差数组。 以上内容就是对牛斯君的一个简单的分析,你还有什么问题吗?欢迎留言。

这节课讲的比较简单,来看一下四顺类的常用方法。来看代码,这是一个字符串,由英文单词和逗号组成,那这个字符串它有多长,也就是有多少个字符组成。用方法乱词来获取。执行一下, 长度是十一,那如果再加一个空格呢? 变成了十二空格也是算在长度里的。再来看另外一个方法, 你这个是哦,意思是谁的下标是多少? d 的下标 d 在这里来执行 一下, 字不算长度是十一,这个地他的下标是十,那这不是最后一位吗?为什么不是十一呢?因为他的下标都是从零开始的, 零一二三四五六七八九十,所以最后一位他的下标比他的长度是小一的。来看下一个方法, 意思是谁的最后的下标,那某一个字符怎么还有最后一个?对,一个字不串,里面可能有多个同样的字符,就像这个 l 里边有三个,那他最后一个就是这一个 l 的最后的一个下标是九。再看下一个方法, 斯普利特分裂分割小号里边是按什么来分割?这个字不算,按逗号分割开,获得的是一个数组。来看下一个方法, 萨宝斯成指字幕串,从某一个位置到另外一个位置,截取这个字幕串,开始位置,结束位置。执行一下, 零到五零一二三四五, 嗨喽加逗号。但是为什么答案呢?没有逗号呢?因为这个方法截取的时候包含开始位置,不包含结束的位置, 所以没有逗号。来看一个例子,这有一个文件名是字不串,他来获取到他的后缀,这样来获取到 从地这个位置开始结曲结束的位置应该是哪?是戏吗? 如果是细的下标的话,这个地方,那么截取到最后是不含细的,只有一个地区,所以必须比细这个位置的下标大一,看一下他的下标是多少。用这个方法, c 这个字不算运行一下, 下边是十一,所以应该截取到十二来看一下 的游戏。但一般情况下我们不这么写,这样写太固定了,如果来了另外一个文件名,他的长度肯定不这些,下边也就不对了。我们这样来写 开始和结束位置,这样来获取,开始位置是 d, 因为一个文件名,他的后缀都是带点的,这个点是固定的,所以我们获取到这个点,他的下标,防止里面有多个点,所以 用最后的一个下标,获取到他的下标之后,加上一,就是后缀的第一个字母的下标,这就是起始位置,结束位置是细。 刚才我们说了最后一位他的下标是比长度少一位的,那就直接获取这个文件名,他的长度 减去一,就是这个细的下标。如果结尾是细的下标的话,这个方法他又不包含最后一位,这样的话截取出来就不包含细了,所以结尾我们不能用细的下标,应该比细的下标大一, 再加上一,也就是结尾,用它的长度就可以了,这样就能获取到了, 不再是固定下标来写了。 游戏来看,另外一个方法,把这个去掉, 我们这样来判断一下,那是踢啊, 等于 s 吗? 那 s t 啊等 s 信吗?执行一下, 他们两个是相等的,但是他跟他是不相等的,他俩相等好理解,那这一个也是字不串, apc 为什么他俩不相等?那如果用另外一个方法来比较呢? st 啊,一口 st 再执行一下, 这样比较是相等的。等号比较的是引用地址,所以他跟他是不一样的。而这个方法比较的是里边的字不串的内容,因为内容都是 abc, 所以是相等的。所以字数上我们比较是否相等的时候,使用这个方法比较里边的内容是否相等,这才是我们的目的。好了,这期课就到这里。


你突然发现你有一个很厉害的爸爸是多么爽的一件事,原来很多不敢想的事情现在都能做了。扎马壮也是一样一个类,一旦有了继承 负累的方法都可以拿过来用。我们通过对象调用这个类的方法相当于我们平时喊别人做什么事情,例如我们会喊张三出去玩,但是你有没有发现,我们就从来不会喊自己的名字,让自己去做什么事。比如我们会说我走了,而不会说李白走了,而这个我在扎马中就是 nice。 我们在自己的泪中都要用自己的方法,通常就使用类似这里包含从负累继承过来的方法。但有时候我们会发现,我们做事的方式与爸爸截然不同, 比如学习,爸爸是去学校学习,而我们是上网课,因此就按照自己的方式重新实现爸爸的学习方法。在扎瓦中我们把它叫做重写,这时候我们的学习方式就变成了上网课。根据实际情况,我们有时候也去 学校上课,因此我们也要用到爸爸的学习方法,而这个爸爸在扎瓦中就是 super, 这个方法我们把它叫做承载,学会了吗?

谁要是再告诉你死菌是不可变的,你把这段代码甩给他。在我们学习加码的过程里边,通常对死菌的描述中有一个特点在于他是不可变的,那意思就是一旦声明了死菌的变量, 他的值在内存里边是不可修改的。那么原因呢?有这么几个。第一个呢,死菌是菲尔修饰的,他不可能有子类,所以也不可能有子类的方法进行重写,以改变死菌的值。 第二个呢,对于时润内部使用了一个 fine 修饰的制服速度,当然在加完九之后已经改成了拜特速度。 那么对于这个 fire 数组呢,我们没有办法重新为他复制。那第三个原因呢,是因为石俊这个类并没有提供任何一个帕布里给的方法来改变内部的字母数组。至于这三个原因,我们得出一个结论,石俊是不可变的, 但是在加法里面提供了一种反射机制,那么这种机制呢,是很容易去改变尺寸里边的字符速度,大家可以看一下。首先有一个字符叉 name, 它的出数值是汤姆,接着使用克拉斯里边提供的一个 get declared feel 的, 那么把 value 这样一个属性获取掉。由于这个属性是一个私有的,那么我们要想访问的话呢,可以使用 feel 的方法 set excess bo 让它为处, 那么再通过 fail 的提供的方法 get 将内幕作为参数,那么就拿到了 value 属性的词,那由于目前我使用的是 gdk 八,所以说它返回的结果我们强调成一个字母输入, 那么既然是一个字符数组,那我就将里边的元数直接更改掉,最终我输出内幕,我们可以看到结果就将 小写的 tom 改成了首字母大写的 tom, 好,结果呢?正如我们所料,这种代码你看懂了吗?切。

为什么你在 eclips 下面开发的这个加网控制台程序,明明 parent 的是一段中文,但是输出的呢?是一堆问号,问号类似的乱码,那这是什么原因呢? 你说我已经改了什么呢?改了窗口首选像里面工作区的这个啊,编码改成了 utf 杠八, 然后呢?哦,我这也改了,这边在他的这个资源管理器里面右键啊,我也改了他的这个编码,但是就是不行,为什么呢?这是因为我们的这个控制台的这个啊,加完程序他的输入标准呢?是一个什么呢?是一个 gbk 的一个编码方式,所以说这个时候我们要去改什么地方呢?他的他的运行,然后里面有一个配置,运行这里面去找到这一,这有一一排 一排水下卡,找到倒数第二个公共的,这个公共的这个地方,他的缺点只是这个,我们需要把它改成 gpk 编码,选择这个 输一个 gpk 编码,大写的或者小写的都行,输入之后,然后点击应用, 然后呢运行。你看我的这个原原话就说出来了,记住他的这个标准,是呢是什么呢?是他的这个 gbk 编码标准是什么呢? gbk。 如果你的什么呢?你的这个地方啊,控制台输出出现乱码了,那这个时候你就需要改运行里面的这个编码就可以了,我们来把这这句话再还原一下,还什么呢?因为在交往程序中 定制标准输入的编码方式为我们的这个 gbk 编码,所以说这个时候就正确了,这个小技巧你学会了吗?


今天来讲一下搜索功能,先来看下界面,这里就是输入关键字,下面的话就是显示这个搜索结果,这个是功能使用。我们接下来看一下原码实现。先来看这个入口,入口的话是这个控制器内 那个是搜索的这个入口方法,这里是入餐,这个是查询关键字核心的代码,这里会调这个 service 层的这个搜索方法。我们直接点进去看一下,现在已经进了这个 service 层的这个搜索方法。 这个就是搜索功能的这个具体实现,现在看这个返回数据,这个是返回这个查询结果,核心代码是这一行,这个执行这个搜索命令。这个是调到哪里去的?搜索功能的底层是调到 vds 里面去了,是 vds, 它是包含了一个 vds 设计的子模块,它是支持搜索功能的,所以本质的话其实就是调用 vds。 vds 的客户单去调 vds 服务器查询了这个搜索结果。 拿到这个搜索结果之后,再把它转换一下,转换转换回我们自己想要的这个对象,其实就是把对应的子弹,然后复一下子得到这个结果。