00:00
行,还回到咱们刚才提的这样一个问题,我们定义了两个customer,咱们呢,这个eo方法用的时候还是object当中的发现跟等等一样,要等等一样的话呢,我调你就没啥意思了,那我干脆就等等不就完了吗?那我们现在用equals呢,也想像string或者是date一样的比较这两个对象的实体内容是否是相同,那你此时呢,就肯定是要对我们object当中这个EQ方法呢进行重写了。那下一个我们说的问题呢,就是我们自定义类该如何去重写equal方法自定义类啊,或者我们这样说吧,通常情况下。哎,我们自定义的类,通常情况下,我们自定义类如果使用ES的话啊,那么也都不是想让它体现那个等等的功能,而是呢,也想让他呢去比较两个对象的实体内容呢,是否是相同的。
01:02
啊,我们自定义的类如果使用equals的话呢,这个也通常是比较两个对象的实体内容是否相同,那么我们就需要呢,对object当中这个依方法呢进行重写。需要对object这个类中的。AQ的方法进行重写好,那下边呢,我们就开始去做这个重写工作了,找到我们的这个customer。那么我们要想比较两个对象的实体内容是否相同,也就是说呢,你的name和age呢,是否都是相同的了,那那我们呢,首先要重写了,重写那就得符合重写的规则,大家呢,可以去找到源码呢,把它粘过来。这样可以,或者呢,你直接在这个位置呢,就EQ out斜杠一下,直接呢就回车啊也是一个重写了,行,那我们该怎么去写呢?刚才提到了我们这个叫重写的一个原则,重写原则呢,就是比较两个对象的是不是实体内容是否相同。
02:21
那么在我们这个问题当中,实体内容及我们的这个name和这个A,那是否呢是相同的,那怎么写啊。啊,猛一下没啥思路,没啥思的话呢,你可以呢,看看看看谁呢,看看人家怎么写的string的话呢,有一个equals点一下。这是不是人家的写法,看完以后的话呢,是有点不太想看了,就还有点长是吧,你看啊,他这个E后的E后的方法,这是瑞写的,咱们呢,其实是可以看得懂的,这个字符串刚才呢,我们这写了个叫ID硅谷,然后呢,这又写了个I硅谷,你看它是怎么比较,这俩是不是相同的啊,首先呢,一上来呢,C呢,就是你调了一个方法的对象,这呢就是你行三的这个对象,这呢,它上来先等等一下返回处,这是想干什么?对,你想想调这个方法的一个对象和这个形态的对象,你俩要是引用地址都相同了,咱是不是就别比了,地址一样,你说里边它是不是也不可能不一样啊?
03:29
对,引用地址都一样了,那就一定是处了,就别整那么复杂的咔咔进去了,所以呢,这其实是一个便捷的一个入口,挺好的,咱们也可以一会儿抄一下。然后接着往下,接着往下的话呢,就是看一下这个行参,因为呢,咱们是继承于我们呃,重写的这个object当中的方法,Object当中呢是一个object的型参,所以这块呢,你也是一个object类型的,首先呢,我们判断一下你这个型参啊,是不是string,如果你连string都不是,那就那就别考虑了。我这个string掉了一个equals里边放了个date,那就别考虑了,肯定是false,对象类型都不同,那对象类型如果相同了,相同以后呢,咱们是不是先把你这个形态呢,先强转一下。
04:12
咱们讲多肽呢,这不是提到了强长完以后你也是个字符串,我也是个字符串,那怎么着啊,咱俩比了比的时候呢,他也不着急说一个一个去比,先看一下你这个行参你这个字符串多长呀?啊,我这个长度是N行啊不是这是咱们这个这次啊,这次的这个字符串的长度,你看到一个value是吧,其实这块呢,就咱们所说的这个string,我们叫磁物串,实际上底层的话呢,它是一个叉形数组。我们这个写了一个hello,是一个字符串,实际上呢,底层呢,它就造了一个查询数组,这个查询数组这个长度呢,就是五。就是这样的意思,那这就涉及到这个底层都是数据结构的一个情况嘛,好再回过来,那么我们先看一下当前的这个字符串,这个长度是N,然后看一下你这个行三的这个字串的长度呢是多少,如果咱俩长度一样,咱们再去比,如果长度都不一样,别比了,肯定不一样了,长度一样的情况下呢,咱们取出咱们两个这个差型数组来,然后呢,我就一个一个比了,这个I等于零,咱们就一个一个的这个NNN减减是吧。
05:20
N减减不等于零,真的是一个终止条件了,就是你别到这个末尾就行,然后呢,我们就一个一个去比,只要呢出现一个不一样了,那就是false,要一样呢就接着加加,如果这个循环呢,结束的时候呢,也没进去过这个操作,那咱俩的内容呢,还真就是一样了。这就一个一个去比这样的操作了,行,那看完以后呢,能够能够给我们的启示呢,其实这块没啥用,这张是字符串,它这个自己的这个特性决定的,我们感兴趣的其实就是这个操作,咱们呢,也可以在这里边呢,去抄一下,把这个行参CTRLC,咱们这替换一下说如果呢,当前对象和我们这个行三呢,咱俩的引用地址一样,直接return出。行,那没有走这个操作,那肯定咱俩地址不一样了,地址不一样的时候呢,我们接着做什么事,对这个也有意义,就是咱们看一下你这个行参是不是一个customer吧,依附一下,先看看你这个OB接是不是instance of,是一个customer,你要是个customer呢,咱俩还可以比一下,如果都不是呢,直接这块呢,我们先return个false了,就这么着行,那么如果呢,是一个customer先,是不是得把你先强转下来,我写一个叫customer customer这个把我们这个obj扔过来。
06:44
这时候呢,你呢,我看到的也是一个卡了,我本身呢也是个卡,咱俩呢,看看是否是相同的,是不是就比较两个对两个这个对象的这个每个属性是否都相同啊。
07:00
是否都相同,那么比如说这块你先想到的是用个if,那就先用if了,当前这是一个对象,首先呢,它有一个属性叫age age咱们直接用等等就可以了,跟你这个行参的这个age呢,是否是相同的,如果要是相同的,并且当前这个对象的name和我们这个行三的name呢,也得是相同,那这时候呢,用什么符号?用等等对吗?看看这样行不行,这是绝对不行的,咱们现在既然你说了比较内容是不是相同了,到这呢,是不是就也不能去比地址啊,就是你这个内幕这个呢,你的内容和我的内容是不是相同,所以呢,这个还得要去调ES吧。哎,这样写这呢,大家一定要小心啊,对于这里边的引用数据类型的时候呢,都要用这个E扣了,基本数据类型没得选,只能用等等就比数就行了,当这俩呢都一样的时候呢,我们return一个true,然后else我们就return一个false,能不能看懂啊。
08:16
这就这样写,这样的话呢,其实写的呢,稍微的有点繁琐了,直接在这个位置,对我就直接呢,Return一下这两个事儿。看是不是一样啊,那你这是个true,我就return true不是true就是false,你直接就拿它来说不就完了吗?那这个呢,咱们就写完了,写完了就那这个else的话呢,就是当你这个没执行进去,它就执行到这了,大家呢也可以呢,你写一个这个else这么着也可以啊。把这个扔进去也行啊,你要这样写的可读性更好,那就这样写,其实跟我们刚才这个写法呢,是一样的,行,这个以后的方法呢,我们就写完了,写完以后大家回过来你看一下,我刚才呢,咱们执行,你就看倒数的第三个,这是一个false,倒数第三个这个false,现在呢,我们再去执行。
09:13
那它就变成了出了。相当于我们把这个false呢,就改成一个出,诶保存一下,你要是还是不放心,说到底是执行了吗?这里边儿呢,你加上一个输出语句。说呢,这是我们customer它当中我们重写的这个echo的方法,这样一下保存,那过来呢,你再测试一下。那这不就说明确实呢,是咱们重写的这个方法的一个执行没有问题。这的把这个我们就注释了,好这个简单总结一下,关于我们这个equals的一个使用这个equals的话呢,默认呢,是咱们object当中的定义的,呃,如果我们自定义这个类呢,没有重写的话呢,那相当于用的还是object当中的比较呢,是两个对象的引用地址是否相同,但是通常情况下,只要呢,我们这个自定义的类,咱们调ecos了,通常呢,都不是想比较地址是不是相同了,也是想比较内容,那就意味着呢,我们需要进行一个重写,那么重写的规则呢,就是拿他们两个对象的这个所有的属性,或者说呢,主要的这个属性,你关心的这个属性呢,进行一个比较,看看他们是不是一样就行了啊,比较两个对象的内容是否相同,这个我们重写了一个规则啊,这呢也稍微粘一下诶,CTRLC一下。
10:46
哎,这呢是针对于我们这个问题的啊,咱们通俗的来写的话呢,就是这样一个情况。行,那关于这个ES的话呢,我们相当于就基本上这个核心内容呢,就算是讲完了,就是这样的一个情况啊,我们呢,就重新好了,那么真正开发当中,我们用到这个ES的时候呢,呃,真的需要自己去重写吗?
11:10
你想想它还是挺常用的,挺常用的话呢,我们还要自己去手写,那还是挺麻烦的,那就跟那个get set一样,说能不能自动生成一下,确实呢是有的啊,我们这呢,大家把这个equals呢,咱们给它注释一下,这呢只能看作是咱们自己手动实现的。手动实现E的重启。这那么除了这种手动实现之外呢,咱们看这个SS下边呢,它就有一个叫生成叫哈希code和ECO的方法,点一下,那么我们生成的这个哈希code或者e code方法,这个哈希code呢,大家先忽略掉,咱们目前呢先用不着,那么这个e code的方法呢,他就问你是需要让哪些属性参与进来进行比较呢,我们说这两个都需要,所以这呢,默认就都打上勾了,然后我们点一下这个OK行,大家呢,会看到上边这个E扣S重启了,这个哈code呢也重启了,这个呢暂时咱们用不着,我就先删掉了。
12:16
那这个ES呢,就写好了,这呢,就是我们这个自动生成的,诶自动生成的这个ES。自动生成这E呢,也是用来比较两个对象的实体内容是不是相同的啊,这个肯定没有变,嗯,具体细节呢,我们比如说先不去看了,咱们还是回过来先跑一下看看这个结果呢,是不是个出执行一下,还是一个出没问题,那么真正在开发当中呢,大家呢,都是自动调出来的,就是实际开发当中,我们都不会自己去手写的,都是自动调的。为什么呀?
13:00
一方面呢是省事快,还有主要的方面就是咱们写的这个呢,还是比较简陋的。咱们写的这个呢,你看这个代码量好像也不少,但是你看人家这个情况似乎看着是不是更复杂一些啊,确实呢,也是更复杂一些,那人家肯定这个能力水平不会比咱们写的这个低吧,反推法是吧,它要低的话呢,是不是你就去开发GDK了,就不用他开发了啊,那自动生成这个呢,他这个从这个算法角度来讲,它这个健壮性呢,就更好一些,哎,然后我这个细节呢,先不去讲,大家下来有兴趣的话呢,先想一想,为什么他这个写的就更好,我们写的呢,就差点意思,在某些极端的情况下呢,咱们这个的话呢,是不好的,或者说有一些漏洞存在,暂时呢先不说,等到这个明天复习的时候呢,诶我们再对比一下这两个有什么区别。好,那么你知道开发当中我们都这样去用就OK了,但是呢,虽然我们开发中这样用,但是也要求大家呢,你会基本的写一个手动的ES,为啥呢?就是可能对这块呢,没什么太大帮助,但是咱们后边呢,讲集合的时候呢,会去比较两个对象的大小,我们会写那个compare方法,Compare方法呢,跟我们的equals方法的这个差不太多,把它变一下形就是了,那个方法呢,需要咱们会写啊,就是说我们里边这个逻辑呢,在这个equals这块呢,可能用不上,但是在后边的时候呢,会用得上,所以这块呢,也要求大家呢,也能够自己呢,试着呢去手动定义一个啊,这就是这样一个情况。
我来说两句