00:01
好了,同学们,那咱接下来继续看咱们这个。对对对对。啊,不一定,你哈希麦克这块你看情况呗,对吧,你预估计呗。是不是你你里边要存多少东西,你预估计一下,给个预估计长度,但最好是二的倍数吧。这不给最好是二的倍数吗?是二的倍数就行啊。长度不一定是16,你是二的倍数就行。好,那接下来咱接着看,还是这个map,咱们测试一下各位啊,来继续下一个例子,这个哈希map test02。加啊注意听了各位注意了。有什么问题咱们课下再讨论啊来,那么这块的话,咱们去加一个类,各位啊,这个类呢,假如说我们在collection下面写一个class,什么叫student。这个呢,哎呀。
01:03
啥情况?重复了。Student的重复了,有呢?有的也充了。哎呀。Student。Student。这咋整?这样吧。删了。我在这建一个包行吗?在加SE下建个新的包啊,这个包呢,叫ant t吧,磁体或者是B或者是domain啊都行,我叫。B吧B包啊包下呢,新建了一个class,这个class叫student。行,这样就可以了啊,包换了。那这个啊,各位继续看student,它有一个什么呀,有一个name。老规矩啊,给他加一个name,然后接下来呢,我该给他加的这个构造方法是无参的,给他加上对吧,然后构造方法是有参数的,给它加上,然后呢,再加一个什么呀,Set get方法给它加上。
02:14
啊。然后呢,没了无参的有参的是不是,哎,然后get方法set方法很简单啊,那么这个时候呢,我在这里呀,没有重写equals。Code和equals我都没有重写。大家注意看啊,ES还都没有重写,没有重写,现在我在这里,我new一个学生,不是student s1学生,等new一个学生new student的时候呢,我添加一个参数,这个参数假如说就叫张三。那么这个student呢?还不行。Student。用的是这个里边的内部类是吧。
03:03
用的累不累啊,用的还不是我这个student。这怎么办,同学们?挂了吧。这个关了啊。这关了。这边不是报错吗?不要了啊,咱们统一都写到这儿。我。Class叫做哈希map test02了啊,还是编号是零二啊。我没有重启high的equals,然后这块呢,我去一用一个student行吧,这边呢叫张三。然后呢,S2呢,我也new了一个student,然后呢,他的名字呢,叫还叫张三。行吧,那大家看S1.1cos谁啊?S2这个结果是不是false啊?是不是重写E的方案之前是false啊?
04:04
因为你扭了两次,比较对象内存地址嘛。是不是重写equals之前是不是false,重写equals方法之前是false。那重写异构的方案之后呢?重写echo的方法之后。那就应该是出了呗,对不对,所以这块呢,我把它拿过来啊。拿过来之后呢,我们这边怎么着啊,重写一下equals。Public是不是返回布尔类型方法名叫equals参数object。首先判断一下,如果是OBJ等于等于,那。或者说他不是一个什么呀。嗯,Instance of student,那我认为返回一个什么for,这个代码是他之前写过的啊,如果说OBJ要是等于,等于什么this。那直接return一个true就行了。
05:00
嗯。我们这个equals判断什么呀?就是如果啊,就是如果,如果学生名字一样,表示同一个学生。啊,那这块呢,应该是怎么做呀,OB这强转呗,转成谁呀,Student吧,那转成student。是不是?哎,然后接下来判断一下,如果说this.name.e是谁呀?s.name那名字一样,那我认为就是什么呀?相等的return true吧,其他情况return一个false是不是?哎,好,这个代码大家能看懂吗?如果学生名字一样,表示同一个学生吗?如果名字和这个名字一样,返回true吗?或者说或者说你这个可以省掉,不写你这个return to呢,也可以不写前面直接return呗,是不是如果名字一样,就表示同一个学生。这个equals是我们字符串的equals啊。是字符串,你点过去你看吗。字符串的equals吗?是不是in this.name之后啊,它返回的是一个什么string字符串吗?字符串的equals方法啊,来这是如果名字一样表示同一个学生,现在我们再去运行,你看。
06:12
是不是结果就是处了?这回S1和S2是不是就是表示同表示相等啊,S1和S2怎么着表示相等吧啊,表示相等,那么接下来呢,我们来看一下啊,现在这个一的哈西扣的是多少。S1的哈扣的啊,一的哈希扣。啊,然后S2的哈扣。S2的哈,Code s2code。那么这个哈code方法大家想想是不是没有重写,没有在这里重写哈code方法调的这个哈code是谁的?哈code是不是负类object里边哈code方法?而这个high的方法是返回内存地址啊。因为扭了一次,这个内存地址和这个new内存内存地址是不是一样,所以这个值和这个值是不是百分百是不一样的,对吧,所以我们运行一下。
07:11
好,大家看这个含义值是多少啊,是什么?284720968。对不对,下边这个含义是多少?122,什么883338。对不对,哎,那么这个是不是会通过一个哈算法转成数组下标啊,这个是不是也会通过一个哈算法转成数,转换成数组下标啊。对不对啊好,那现在我问大家问题,现在我S1.1cos s2,现在的结果已经是true了。那我往哈赛集合里边放的话,是不是只能放一个。是不是应该按说来说,是不是只能放一个进去,大家思考一下。S1.1cos括号里边S2,结果已经是除了表示S1。和什么呀?S2是一样的,相同的。那么哈西塞那么往往什么呀?哈塞集合中放的话。
08:06
按说啊,按说只能放进去一个对吧,因为哈塞的集合有什么特点呀,哈塞的集合特点是什么呀?是无序怎么着不可重复吗?是不是有个不可重复啊,所以这个时候我set。集合。啊。然后呢,接下来。Students knew一个什么哈?来用完这个哈希side之后呢,接下来我们students.i的方法,把S1放进students,把这个叫做S2也放进去,现在我输出这个students这个集合,它的size好,这个结果是几?这个结果,这个结果应该是一。
09:01
对吧,因为你S1.1cos s2结果是true啊,S1就是S2 S2就是S1,你两个放进去是不是。只能放进一个。你好,想想。对吧,哎,我们运行一下各位,大家猜一个结果是。是一还是二?一。如果你听懂杜老师刚才讲的这个存的原理的话,我觉得这个问题应该不大。他先调的是还是。先调的还是各位。没有人回应。存储元素和取元素的时候。
10:02
都是先调high side集啊,都是先调什么high,再调ES。注意啊。向map集合中存。以及从map集合中取,都是先调用什么T的哈西扣的方法。然后再调用什么equals方法。Equals方法有可能调用。也有可能不调用。好,我问大家一个问题。大家思考一下啊。思考一下,就是说equals什么时候掉,什么时候不掉。拿拿谁啊,拿put的方法啊。
11:00
举例。啊,举例。什么时候equals不会调用?相等就不E了。就是我们往里边存的时候,各位。他会先调用哈扣的方法,对吗?如果这个位置没有单向链表。转换成数度下标,这个下标位置上,如果这个位置没有单向链表。是不是这个不用调ES直接就加进去了。对吧。
12:00
哈希,Code一样的话,你代表是一个列表啊,那得调ES啊。对吧,Put k举例。Key的哈希扣的方法返回哈希值。哈希值经过哈希算法转换成数组下标,数组下标位置上如果是捺。不需要执行。那拿get这个方法举例呢?什么时候equals不会调用呢?如果什么单向链表上只有一个元素,试试。
13:05
啊,不需要调用什么equals方法。你想想,如果这个单项列表上只有一个元素,假如说这个位置只有这么一个元素。然后你通过哈的方法已经得出下标了。对吧。呃,得需要错了,需要啊,需要不应该是这样,各位我这说错了啊,如果。如果。同样也是捺啊。如果数组下标位置上。就还是这个啊,K的哈方向访问哈值哈值经过哈方法转为数组下标,数组下标位置上,如果是nu equals不需要执行。跟这个一样。一样通过K啊。是不是来得出数组下标,下标位置上是空的,什么也没有,你懂吧,没有。
14:00
啥也没有,那还掉啥E口子?是不是一个度就不掉了?对吧,包括你存是不是也是一样的。存的话你就直接叭放进去就完事了,因为这里面没有没有元素啊,所以不用调ES。就但凡是说你这个位置有元素。有一个也好,有个单项列表也好,对吧,只要是有这个ES就一定会掉。你存的时候会掉,取的时候也会掉。明白吧,啊,对的方法你了解一下啊。
我来说两句