00:00
这个描述完以后,那下边呢,我们再说第二个事情,第二个事情的话呢,我们来提一下什么呢?这个string咱们怎么去给它赋值,看一下PPT string赋值的话呢,这就相当于对象的创建了,我们呢,其实有两种典型的方式,只有string呢有这样的待遇,因为呢,它可以直接去赋值,这种叫自变量的方式赋值,还可以呢,通过new的方式赋值,毕竟呢,你也是一个类吗?啊,那么构造器的话呢,咱们也可以去看一下这个API哈,这块我就直接把常用的这个API呢,就给它提取出来了,大家来看一下PPT就行,除了这种方式之外呢,我们可以去new一个string,这个形态呢,我们什么也不写,什么也不写,这种方式本质上呢,呃,这个在内部哈,因为咱们呢,给字符串赋值,其实就相当于给你内部的是不是叉形数组赋值了,哎,那么我们这个差形数组呢,是相当于拗了一个叉长度是零,长度是零啊这个注意那。
01:00
如果呢,你要是你有一个string在这个位置,比如说写了一个hello,相当于底层呢,我们就hello是五个字符,造了一个长度是五的一个查询数组啊底层呢,它是这样的,做了一个复值啊这呢就是一个长度为五的一个插形数组了,所以付给我们这个四百六啊哎还可以呢,通过这种叫呃这个放一个查询数组的方式,直接呢就放个查询数组了,实际上呢,是做了一个copy的操作了啊复制把这个数据呢,我们都复制到人家这个里边啊呃还可以呢,从这个数组当中挑指定的位置开始放指定个数个,比如说你这个插件数组呢,假设是A就个不加单引号了啊所呃de这呢是五个字符,我这呢从二开始放两个啊从角标2012,从它开始放两个,那就把CD呢取出来放到我们这个词频当中啊,那除了这几个构造器之外呢,还有很多其他的这个,大家呢,你可以到我们这个词缀啊,到我们这API里边呢,你可以去看一下,它呢还是比较丰富。
02:00
的看往下走,这都是啊啊string呢,咱们开发中确实比较常用啊,所以说这里边这API呢,好多呢,我们其实也都会比较熟悉,后续咱们讲IO流的时候呢,还会用到string的一些这个API,到时候咱们再熟悉一下行,那么这里边的话呢,咱们主要想说的就是这个事和这个事儿,这个呢,刚才已经说过了,直接在常量池里边去声明,那这个new呢,New有点区别,因为咱们前面讲面向对象时候说过,哎,New的结构是不是都得在堆里啊,哎,那这里就涉及到哎这种跟这种啊不太一样,哎不太一样,所以呢,我这儿在。哎,这个位置,然后写了一个说呢string h21是ABCS2呢,H2呢是你有一个string角ABC有什么区别啊,哎,这也是,呃,笔试的时候呢,有时候常按问的一个问题啊,大家老是用string,那你得清楚string内存结构,因为你只有清楚内存结构呢,你掉的时候才不会出问题啊,你才会去考虑什么样的效率高一点或者低一点这样的一些问题啊好,那咱们下边呢,就把这个事儿呢说清楚。
03:12
嗯,这个我就。习惯上是我我往上写了啊,所以大家你看那个代码的时候呢,你就从下往上看。Public world test2。嗯,这呢,咱们主要来说一下这个string的一个算是叫实例化,实例化的这个方式啊,这个方式一典型的我们就是通过字面量定义的这个方式啊,这是第一种,然后方式二,哎,咱们是通过谬加构造器的方式。啊,这呢是典型的两种方式,好,那么这里边我们做这样的声明啊,其实就相当于这个小的练习了,S1等于,嗯,我叫一个JAVA1吧。
04:07
所以S2我呢也叫做JAVA1。这个呢,你应该知道它在哪放的。写一下啊,说此时的S1和S2这个的数据啊,数据呢叫JAVA1,它呢是声明在是不是诶方法方法区中的字符串常量池种。哎,这个呢,其实就对应的我们说的这种方式一这种自面量的定义这种方式啊,哎这种定义方式的特点是它好,那接下来呢,我通过这个string呢S3,哎我呢去new。右这个位置呢,我就不用这个空参的了啊,我写上一个写上一个张阿姨。
05:02
哎,然后呢,我再顿一个S4又一个string,这呢,我也叫这一。好,这就写完了,那么这个呢,其实咱们前面也说过啊,只要是new的结构,都在对空间中去开辟。哎,用的这种方式,我们说哎此时的啊,这个S3和这个S4啊,这个呃,相当于他们这样说吧,保存的这个地址值啊,哎是数据啊,在堆空间中啊,开辟以后,这个数据就是字符串在堆空间中开辟空间以后。哎,然后呢,哎,对应的这个地址值啊,哎,说白了呢,就是我们这个new的时候呢,咱们首先呢,你得在堆空间当中去给人家啊加载啊,就开辟这个空间,好那把堆空间你开辟这个空间的地址呢,给了S3,给了S4,下边呢,我们写这样的几个小的问题。
06:12
那么第一个刚才咱们已经讲过了,如果我用等等来判断S一等等于S2,这是出还是false出常量池里边呢,我们说不能出现这个相同内容的了,它俩呢是因为一个,那么接着呢,我拿S1等等去判断S3。等等,对这个你先想想啊,然后S1呢,我用等等S4,然后在S3跟S4。这几个是什么呀,这是false这个呢,False这个哎,False都是false,嗯一跟三这个我看我这啊,我这呢写的是叫ABC了。
07:04
啊,我这写到ABC了,哎,通过这个呢,咱们就能说明说明这个区别,你就改成张二一就行啊呃,S1呢是这样的,不用多说这个S2H2的话呢,我们这是new的一个new的就得再堆在堆里边呢,我们扭完这个对象以后,我们是把堆空间中的这个地址,可能比如说叫这个哎3456吧,0X这个地址呢,是不是就是存在这个3456了啊,然后人家这个地址呢,可能是1234啊。嗯,所以说呢,我们去等等比较地址的时候呢,他俩显然不一样,一个是这个地址,一个是这个地址啊,那么具体的再去说明我们这个new的这个string里边呢,你既然是个对象呢,它就会有这个VALUE6的属性。咱们刚才看源码,这个Y6是个叉形数组final的,对,那这个Y6属性它也得有个值,它的这个值呢,你是不是一个引用类型变量啊,你是不是存在也应该是个地址值啊,这个地址值存在谁啊?
08:06
哎,就是我们常量池里边这个ABC的地址值,所以这个1234呢,在这儿呢。啊1234在这儿相当于用的还是它啊,那咱们现在比的呢,是它俩的地址,是你堆的这个地址和这个的地址,所以它俩是不一样的啊,那咱们额外的我再再在这个,呃多说一句,你说如果我们这个str哈,我后边呢,给它又改成了这个,比如叫DEF了啊,他会呃过来这儿,然后把这个改了吗?不会,咱们那会说了,这个是绝对的叫不可变形,对它的任何修改呢,诶你都得是重新造。啊,其实你想想Java为什么要这样定义呢?咱们刚才说了,说你这是一个,我要是,呃这个S3呢,也叫ABC,它也指向它,嗯,因为咱咱们共用这一个了,咱们得保证什么呢?你这个一你改的时候呢,你别把我S3也给改了。
09:00
咱们这时候用的是一个你要变的话呢,你不能让S3也跟着你变是吧,所以呢,你要变你自己去变啊,你别影响我啊,这就叫不可变形了。成,哎,通过这呢,咱们就知道了,说这个这个肯定是false,那对应的呢,这也是个false了,那现在呢,三跟四是false,咱们前面讲面向对象,这不是说过了对新的对象了是吧,新的对象的话呢,你这个2NEW的用等等,那当然是false了。这个我应该是有这个图啊,大家看一下。这不咱们刚才写的这道题吗?理解吧,哎,一二地址一样,三跟四是两个地址啊,2Y6呢,都指向这个。哎,这个就OK了啊,这就OK了,嗯,那要这样OK以后呢,大家接着去,呃,像咱们这个什么呢,之前呢,咱们讲内存的时候呢,呃,说的这个内存结构,咱们当时,哎,咱们还拿这个person来说,我呢生命一个类呢,叫做person person里边呢,咱们定义了string性的name in性的age。
10:08
我这呢再去提供一个构造器啊al shift s构造器呢,咱们把这两个都选中这个,你记着按住一下这个CTRL键啊,不按的话呢,就成这样了,按住,然后OK,那你再整个空三的吧,其实现在咱们用不着空参的啊,空三的话呢,你就选中它。这就完美的避开了他俩啊,这就空餐的,这呢有一个构造器了,然后回过来我在这块。我去用两个person。这里边嗯,Ctrl alt斜杠,知道咱们用的构造器吗?哎,我们就用上面这个了啊嗯,先呢叫TO12岁,Ctrl al塔下P2啊,也叫汤姆12岁,好,现在的话呢,我如果是。
11:02
啊,拿着这个p1.name,我要用equals啊,p2.nametrue还是false,显然是出。上面呢,我都懒得去用ES了。那E4是不是必然是出啊,哎,所以咱这呢都用的是这个等等啊哎,你考E4那也嗯太太太简单了啊,咱们string呢重写了ES了,那你只要是内容一样的都是true了,所以这个呢很简单,关键呢是我们现在呢,我要输出一下P一点内幕等等于P2点内。这是出还是false?通过刚才我们讲的内容大家分析一下,注意的是我是通过字面量的方式定义的。二方法。出了呗,就想想。
12:00
True是不是还是处上面呢,处三个false是不是这样的。诶,为啥是处,因为它内存呢,长这个样子。这是咱们刚才拗的是吧,我用这个等等判断,你看啊,我拗了个对象是不是这样了,又拗了对象这样了,咱们前面讲课的时候呢,哎,我当时不是提过这个事儿哈,咱们当时画内存的时候呢,我就直接把汤姆写这了,这个汤姆写这了,哎,对我说呢,就是咱们那时候呢,因为重心呢,还不在死润这块哈,主要让大家体会的就是我们这个,呃,对象的属性呢,就都放在堆里边了,然后你附上值,当然呢,其实关于死论这块呢,我们给它模糊化了,当然我那时候也稍微提过哈,说本质上其实不在这儿。啊,就跟咱们说这个小学讲课一样,这个一年级的时候先告诉你最小的数是零啊,然后呢,等你上到三年级再告诉你,其实还有负数啊,数呢没有最小的啊,你要一年级就想说说这个数呢,我们分成有理数和无理数啊,有开根号是吧?啊顺便呢,再讲讲微积分,整个就疯了啊啊所以我们这个知识呢,就先有一个先后顺序,先讲一个程度,让你感受到是这样子的,然后后边呢再拓展啊呃,现在呢,咱们就相当于是这个说明一下真实的情况啊,我们原来呢说放两个Tom其实是不准确的啊,如果是真的要是放了两个Tom的话呢,你这时候笔你这个存的是地址值,显然这是不是该放了,哎,对,而现在是true,说明他俩的地址值是一样的啊,原因就在于我们呢,这通过自变量的方式定义的,这个呢,数据都在常量池里边。
13:36
啊,而你这个两个name呢,都是记录的常量池中这个Tom的一个地址值,这俩地址呢是一样的,哎,所以呢,这就是个处。那这就是个处,那这是个处理解以后,接下来呢,我通过这个P点内,我呢把它改成叫Jerry,改完以后,我这时候呢,P2点内叫什么。
14:02
叫什么呀?叫汤姆。这个咱们刚才不是说了,是不是叫不可变形啊,嗯哎,你现在呢,呃,这个P啊,你不想叫Tom了,你想在这改,不好意思改不了自己新造一个,哎,你叫Jerry,然后呢,把你这个地址呢改成他我P2呢还叫Tom,哎这样子啊行这呢就咱们说到了关于这种方式和这种方式咱们去造对象的时候的这个区别啊,那区别呢,这是经常在笔试当中,哎艾给尼这样去出去考察一下,这是一个,呃相当于一个小的面试题了,另外一个小的面试题。哎,面试题呢,就会问说我们通过啊,比如说叫string s等于new一个string,这呢,我写一个叫就叫ABC吧,说这种方式创建对象。嗯,对象在内存中啊呃,这种方式创建对象,在内存中创建了几个对象,哎,有时候会有这样的问题几个呀,对这时候呢,我们相当于是创建了两个啊,就是假设一开始还没有所谓的这种自变量的方式,那么这两个第一个是你对空间中拗的是吧。
15:22
哎,这个我们说一个呢是哎堆空间中,哎这个new这个结构啊,创建的一个对象啊,这是一个另外的话呢,你这个new里边呢,我们涉及到的一个叉型数组,哎,那么第二个呢,就是。那另一个是这个差型数组,它呢,诶对应的这个常量池中的。哎,这个数据,这个数据呢,就是我们的这个,哎,本质上这个ABC啊,这是两个这个对象啊,那如果说呢,你一开始常量池里边如果提前声明过了啊,声明过呢,你就用一下现有的这个就可以了,因为常量池里边不会放两个相同内容的ABC。
16:11
哎,所以呢,就用现有的,但是呢,你要泛泛的去讲的话呢,应该还是说有俩啊,只不过呢,你去造的时候发现已经有了,那就用一下,哎,是这个意思啊好这块呢,大家要清楚啊。
我来说两句