00:00
那对于这个赛来讲,最难的这个事儿呢,就是咱们刚才讲的这样一个过程,这个过程呢,大家做一个理解就行啊,这个面试的时候也不会问啊,啊这个面都不会问,当然呢,我写了这么多这么细,它的意义呢,对我们呃,再去讲哈希map是非常有帮助的,为什么呢?因为哈希set和哈希ma克呢,他们俩有关系啊,就是当刚才呢,我那会儿点这个源码时候看到的,我们用了一个哈希set。你会发现它里边呢,其实你有了一个哈希map,我们向哈希set当中去添加一个数据,你会发现它实际上把这个数据呢填到哈希map当中了,所以呢,面试当中经常来问的是哈希map的底层源码是什么啊,那其实呢,这块我们讲哈希set呢,说清楚了,其实我刚才说的这个事儿,其实相当于就在讲里边的哈希map。那面试的时候只会问他,他不会去问你哈希set的底层实现为什么呢?啊,他如果问哈希set的底层实现原理是什么呢?你说对哈希赛底层是个哈希map,那我给你讲讲哈希map了是吧,因为本质上呢都是这个map了啊,所以刚才讲这样的一个过程呢,对大家的意义呢,就是我们讲map的时候呢,大家就更清楚了,他们本质上呢都是用的map啊,这是最难的这个事儿,这个呢就过了啊,那么set呢,在咱们开发当中那会儿也讲到了,它呢,就没有再额外的定义方法了,所以这块呢,我就不用再去测set里边的方法了,都是咱们collection当中的那些啊,嗯,你就往里边加啊,这呢,咱们也以这个哈希set为例呢,稍微演示了一下这个添加操作,这就过了啊,那下一个问题,下一问题的话呢,我们谈一下谁呢?就这个叫link的哈希set,其实也非常简单,跋竟你说他呢,是所谓的能够按照天下的顺序去便利,那我们就看一下。
01:50
把这个呢代码CTRLC一下,我直接呢就哎放到下边这个位置呢,我改成这个二把这个呢哈希set,我改成叫link,哎叫哈希set完了啊就通过这个代码呢,我们去体会一下叫link哈希set它的一个使用。
02:09
哎,它的一个使用,刚才呢,我们去遍利一下这个哈希赛这个事儿的时候,你会看到诶出来的这个数据,诶跟咱们这个添加的顺序呢不一致,但是你别这样说啊,别什么说呢,说你看诶这个添加数据是这样子的,便利出来顺序是这样子的,所以是无序的。对吗?再说一遍啊,说呢,我添加的顺序是这样子的,我遍历出来的顺序呢,是这样子的,不一样,所以说呢,诶无序。对吧,对这俩没有因果关系啊,你要认为无序是这个意思的话呢,那这块呢,就把你给问住了。现在呢,我们遍历出来的顺序呢,和你添加的顺序呢一样啊,跟添加的顺序一样,那你能说这时候呢,我们另的哈赛说整错了,说这个呢是有序的。
03:06
不对吧。哎,这个另的哈set呢,它还是无序的啊,它还是无序的,就是它在存的时候呢,它仍然是,诶这个先有个数组,它是我们哈利赛的一个子类啊,存储结构没有变,哎,它呢还是一个数组啊,那计算哈利值可能A就在这儿,这第一个啊,这第二个,这第三个啊,这第四个,这第五个,所以呢,它仍然是叫无序的,指的是添加的时候,它的存放的位置不是一个挨一个这种顺序放的,这叫无序性。那么它凭什么就可以按照添加的这个顺序去变历了呢?它有一个列表是吧?哎这呢,我就不在这块去看了画了,咱们也不看源码了,因为页码一看就看成那个map了啊哎,我们直接呢看一下我这里的一个简图。我这呢是一个link的哈希set里边呢,我添加了一个两个三个,嗯呃四个数据啊,这两个数据呢,因为一样,所以实际上就存在三个啊,那首先呢是这个AA,假设呢,我们这A呢就放在这了,先算哈奇值,然后呢再判断一下在哪个位置,哎,然后呢,这个诶没有没有直接就放这这个我就给他拿出来了啊放这了,然后第二个元素呢,这个呃一算放这第三元素呢,第三元素跟第二个一样,这个就没放了,哎,然后再放这个刘德华,刘德华比如就放这儿了,他在放的同时,咱们呢又多的呃给他加了一对这个这个这个叫什么。
04:33
这个这个地址或者叫这个引用也行啊,我们添加第一个叫A的时候,因为它是第一个元素,它这就是个no了,然后呢,你在添第二元素的时候呢,我们第一个元素它这有一个next,它就指向你第二个了,哎,第二个这个呢,也能指向第一个,哎,然后第二个跟第三个之间呢,也会有这样的一段索引,相当于咱们link的哈希set。它在原有的这个set,这个哈希set的基础之上,又额外的提供了一对这个,呃,这个这叫什么链表,而且还是个双向链表啊,来记录咱们添加的一个先后顺序。
05:13
第一个练着第二个,第二个练着第三个。啊,就是这样的一个道理啊,把这个点呢,我们在这写一下啊,嗯,它的一个使用通过这个结果啊,我们看到说link的哈希set。哎,CTRLC它呢,诶是作为作为我们哈希set的子类,哎它的子类,然后呢,在这个添加哎数据的同时。哎哎,数据添加数据的同时呢,哎,还维护了啊,这个每个数据。嗯,还维护了。哎,一对这个,呃叫什么呀。
06:01
每个数据还维护了一对这个,呃,这这电表是吧,嗯,这不能这样说吧,每个数据还维护了两个变量啊,这样说吧,两个引用吧,然后记录啊,那么此数据,哎前一个哎数据和后一个数据。啊和后一个这个数据。啊,那么这样设计的一个目的是什么呢?这个目的呢,呃,算是它的一个优点了啊。这个优点呢,我们说哎,对于比较频繁的这个便利操作。哎,对于频繁的便利操作,咱们使用这个link哈希set,它的效率要高于哎哈希set。因为我都记录你谁先来谁后来的了,我找到这个第一个我能能一步到位,我就能定位第二个在哪啊,一步到位我就知道第三个在哪,不用像原来那个,你得可能一个一个去这个数字中去找啊,找着以后呢,还有链表,再去找链表,这个就效率差一些啊,我们这个呢就更快一些,哎这个事儿的话呢。
07:11
哎,我们CTRLC也可以呢,放到咱们最初讲的这个位置。啊,按照添加的顺序去便利,呃,那么按照这个顺序便利的好处就是它便利的呃,频繁的便利呢,效率要高一些啊这个呢,就是为了咱们频繁的便利操作呢,准备的一个类。那就是用它了,行,关于这个结构呢,我们要说的事儿呢,就完了啊。
我来说两句