00:00
行,这呢,就是我们说的这个事儿啊,这个单词还写错了啊equals,嗯,这个说完以后,那么大家呢,再回过来想一下咱们写的这道问题啊,咱们一开始的时候这个user user的时候呢,咱们没有去重写里边的这个哈希code。我没有写它,那没有写它的话呢,这时候的哈西code其实呢,就相当于它也掉了,掉的是咱们这个啊object的方法里的,呃,我们这这个类里的,那我们这类里边这个哈结构的方法呢,哎,你看一下这个源码啊,Ctrl shift t。Object点进来ctrl o一下找到它这个哈希code,这呢是一个native方法,看底层上相当于掉这个C了啊,那它这个呢,其实大家可以理解为呢,就像是一个随机计算的,那杨IG呢,就是像这个user,我们此时呢,其实造的这两个对象呢,我们从这个属性上来看呢,其实是相同的,但是呢,这个元素它呢,随机给我们指定了内存中的一个存放地址。
01:03
啊,就像咱们讲那个内存结构似的啊,这是占这是对,然后呢,我们这呢叫一个USER1,通过哈code呢,给我们算了一个地址值啊就指向它了,然后又又又来了一个对象啊又指了一个啊这个呢叫U2,你可以理解为呢,Object当中这个哈西扣的方法是一个随机给你算一个数,那你要是随机给我算一个数,那这两个数呢,是不是基本上可以看到的,就是肯定不一样了,对,就是你这两个值呢就不一样,不一样会导致什么问题呢?我们还是底层数组啊,那现在呢,我们第一个元素假设已经添加成功了啊,它放这儿,那现在你要填第二个元素,第二元素的话呢,我哈希值跟你不一样,我在那处理以后,是不是我可能就就要放这儿了。对,我要放这儿根本就跟你不用去比,所以咱们会看到刚才呢,哎,我呢这边把这个哎注释掉以后,你会发现这个eo的方法根本掉都没掉,因为没有笔直接就放成功了。啊,那现在呢,咱们把它打开,打开以后,那么就按照我们这个逻辑去判断,那这个逻辑呢,大家看一下这个代码啊,涉及到这个内幕啊,Name不是no,你要不是闹的话呢,我就先算一下这个name的哈,Code name呢又是string string呢人家又重写过。
02:17
那润重写过它能保证什么呢?就是如果你两个这个name哈,比如说都叫Tom,我呢就能够保证你这两个算出来的哈,库的值呢是一样的。哎,它能保证这个事儿啊,行,那么我们先算一下这个name的哈希值,接下来呢,大家会看到这样的一个情况啊,我们先根据这个name呢,算出来一个result,然后呢,这块呢,把这个result又乘了一个31,又加上了一些H。啊,这样的方式呢,又得到一个新的result,把这个呢作为一个结果返回。啊,他是这样做的,那如果我们自己去重写的话呢,可能咱们可以写一个比较low的版本啊,怎么low呢,就是咱们直接呢叫内点哈希哎扣我这样写啊,直接呢去加上一个H。
03:06
诶,我这样去返回,我这个写法呢,稍微low一点,但是呢也能用,咱们举个例子,比如说呢,我们现在啊,这个有两个user对象,一个呢叫U1,一个呢叫U2啊这两个user,那么我反问这个哈希值,如果你这两个对象呢,它的属性呢不一样,我们希望呢,就是你这个哈希值呢也别一样,那如果呢,你要这两个对象的这个属性值呢,都叫汤姆12岁,那你最好算出来这个哈希库的值呢也都一样。嗯,但是咱们这个写法呢,可能会出现一些这个这个。一些这个概率相较于人家这个写法高的一些情况,比如说啊,比如说呢,我们这个呃,名字呢,我们算下哈,值它是24。啊哈,一值呢,内姆呢哈,一值算出来是24,人家这A呢是20岁啊,一加呢是44岁啊不是44岁了,44这个返回的值,那么我们另外一个usercl对象跟你刚才的这个A和这个name呢都不一样,比如说人家的这块,呃,Name算出来以后呢,是20,哎他的年龄呢是24岁,结果呢,你一不小心算完以后是不是也是44了,那这时候你这是44,我这也是44,咱俩呢,其实这个属性看都不一样啊,那么这样结果会导致什么样的呢?
04:24
调用e cos的频率比较的对,我们就会去调用那个ES了,是吧,就是我们比如说第一个对象呢,我们是这一组啊添加到这了,添加到这呢,我们再去添加对象的时候呢,你发现哈希值呢,也是44,那我们通过这个算法一算,就也要放这儿,也要放这的话呢,它俩位置一样,它俩位置一样,此时呢,你俩的哈一值也一样,哈一值也一样,咱们说了是不是就得ESES比是不一样。不一样,他俩是不是就该指针了,这个我我就先以八为例啊,那就这样指针指了一下,那倒是也存了,也没毛病也存了,但是咱们这块呢,其实有一个建议就是咱们能少出现指针就少出现指针啊,指针呢其实没有办法了啊啊,能往这块放是最好,还是要往这放的,就不要出现指针了,所以咱们这个写法呢,就会导致本来这两个对象呢,其实不是1COS的。
05:20
但是呢,你这个呃,写的哈希扣的这个算法呢,有点low,就导致呢,你这个呃,本来人家布衣cos,你给大家算出来哈希值一样,就是因为咱们这个算法呢,这个不是特别好,哎它这怎么做呢,它这呢其实也没有多复杂啊,就是让我们这个name呢,乘了一个数膨胀了一下,再加上一个数,这个时候呢,这种冲突重复的概率呢就低好多。哎,所以他就这样做了一下啊,哎,这样做了一下,那这里边呢,哎,提到一个31啊,那如果提到稍微深一点,就这个A31,为什么用31。二的二的五次方就相当于是二呢,是不是向左1515位减一啊,哎,这个数啊,哎,我在这块呢,应该是也写了这样的一个PPT啊。
06:08
在这呢说呢,在eclipse或者idea当中,我们呢,去重写这个方法的时候呢,呃,自动生成的里边都带着这31呢,那为什么会用31这个数,你看下边我这有相应的一些介绍啊,首先这个系数,这个系数的话呢,首先提到说我们尽可能选择大一些,首先呢,这个从想法上来讲啊,我们选的这个数大一些,大些会什么呢?我们会把这个事呢给它放大,比如说原来这个数呢,一个数是五,一个数是六,它两个其实就差一个数,但是我让这个100去乘以五,跟这个让100去乘以六,我们放大以后呢,这就变成500,这个变成600了,它俩呢之间是不是就差100个数了。就是我们要乘一个大的数,会放大你原来这些数的差别。啊,那就这里提到说尽可能让这个数呢,稍微大一点啊,但是大的话呢,也有问题,大的话呢,你算这个数越大,有可能这个是不是就溢出了。
07:00
而且计算起来呢,这个过程也要稍微复杂一点,所以呢也不能太大。啊,就是有找到那么一个合适的数啊,那这里边就提到一个,呃,这个不要太大的一个数,这个数的话呢,我们尽可能的像通过这种位移运算呢,能计算呢是更好的,所以我们优先考虑的就是二的多少次幂这样的一些数了。那2.1次幂,那就二啊,那就是在这就是四八啊,这个十六三十二六十四啊等等等等等,那这些数的话呢,它又是个偶数。嗯,偶数的话呢,呃,它这个呃能被除尽啊等等,其实你这个放大呢,它还有一些这个这个偶数可以约束啊,其实不是特别好,咱们呢,优先考虑呢,就是这个,呃一些这个素数的情况,素数呢,就是不能再去细分了啊,像这里边呢,这些数都是偶数,那么就找跟它接近的,嗯,像这个二呢,加减这个都比较小了,像这个数值都肯定不考虑了,呃像这个八的话呢,你可以考虑像这个七啊,像这个九啊16呢,你可以考虑这个15啊17啊啊这个考虑这个31啊33呀,哎这个呢,哎63 65等等,像这里边呢,你再把这些所谓的这个。
08:11
这个这个非质数都干掉是吧,像这些都干掉啊,像这个啊七呢,其实可以考虑31,可以考虑17也是是吧?哎,这三个数里边呢,我们选了一下这个17呢跟七呢,稍微有点偏小啊,那我们找一个31吧,哎,就这样子就找到它了。哎,是这样一个情况啊,这个大家做一个了解就可以了,哎,我们呢,通常情况下要重启都是直接调一下我们这里边线上的这个方法啊奥shift的S直接呢,我们去调就OK了。啊就OK了啊行这呢,我们就把这两个方法呢,就写完了,写完以后我们回过来必须呢,要给大家说明这两个问题啊,什么问题呢?嗯,就是我们这给我写到。一嗯,这个是它的一个过程,我写到这吧,写个二啊,嗯,要求。
09:03
为了保证我们向set当中添加的数据是无趣的和不可重复的,我们看到这个过程当中既用到了还扣的方法,也用到了这个叫E的方法,所以我们要求呢,就是像哎,这个set当中添加的这个数据啊,或者叫添加这个元素啊,说它呢,所在的类。七所在的类一定要重写两个方法,一个呢叫哈希扣的方法啊,以及呢,咱们叫eo的方法。这两个方法呢,是一定需要去重写的。啊,这是第一个事儿,然后还有另外的一个要求,那么重写,这是两个方法啊,两个方法重写的话呢,我们还有要求,就是这两个方法尽可能的要保持一致性。说重写的这个哈希code和我们这个eo的方法啊,说尽可能。
10:01
啊,保持一致性,什么叫一致性,我这个PPT里边呢,有一些这个说明啊,这个我看前面这块应该也有一个这个介绍啊。嗯,说对应的这个类呢,一定要重写哈code和我们这个,呃,EOS和哈code的方法,那么以实现了对象相等的规则,什么规则就是要保证相等的对象必须呢具有相等的散列码。前面一个叫相等对象啊,可以理解为咱们拿ES判断也是相等的属性呢,也都是相同的啊,然后呢,相同的散类码,散类码就是我们的这个哈希值啊,就是要满足这样的一个诶规则啊。啊,这就是我们所谓的一致性,咱们说的通俗一点就是大家呢,如果有两个对象,这两个对象呢,如果你看到他们的这个,呃,Equals的时候呢,都是数,就说明你这些属性呢,哎,确实从内容上来比呢,都一样,这个时候呢,你算出来这两个哈希值呢,也要一样。如果你要算出你要是两个这个哈希值呢,这个是一样的啊,那你尽可能的发现,哎,他们也确实属性也是一样的,如果人家这块呢,这个呃属性呢不一样,现在ecos呢是false,那你尽量你算出来这个哈希值呢,也不要让他们一样。
11:15
啊,就这样的一个理解啊,这呢就叫一致性啊,在我们这个PPT里边呢,后边我有相应的一些这个啊,这块一个说明重写它啊,就是说我们为了保证这个一致性呢,大家可以考虑的点就是你在哈希Co的方法里边用到的那些属性呢,呃,你也在e cos里边去用一下,或者反过来呢,在ES里边你用到的这些属性呢,在哈code里边呢,也用一下。哎,让他们保持的这个一致性的一个特点。啊,这呢算成是一个小的技巧,哎,怎么保证这个一致性,我们去重写的时候呢,啊一个小技巧。哎,重写两个方法的一个小技巧啊,就是这样子,那其实还有比这个技巧更牛的一个技巧,就是大家呢直接呢去调就完了是吧,说了这么多,总结一句话就是这个呢,大家不要去自己写了,直接呢,你这块把它干掉以后呢,直接out shift s去生成,这个呢,生成出来的它就基本上能够保证就是一致性的啊,直接用人家这个就可以了啊。
12:16
行,这呢是关于我们这里边儿啊,说到的这个重写的两个方法,这个呢非常重要啊。
我来说两句