00:00
那么哈希map呢,咱们就说成这样了啊,这是一个三,这是一个重点啊,然后接下来呢,我们再看下这个它的一个子类。这个四谁呢叫link的呃,哈希map它的一个呃,底层实现原理这个呢,大家了解一下就行,诶毕竟呢,咱们首先呢提到了说它呢是哈希map的一个子类了,那就意味着呢,就是说它存储的时候呢,还是用咱们哈希map里边定义的这个数组去做啊,还是用这个哈map里边这个数组去做,那同时的话呢,我们还提到说link哈map它呢,能够按照你添加这个顺序呢,实现一个便利啊,这个事呢,咱们可以简单做一个演示啊。哎,这个test,然后public word,哎,Test这我写个二,现在啊,比如我这还是一个map new一个,嗯,咱们呢,假设先开始用的是一个哈希map。这么着一个哈希map,然后这个map里边我们去往当中呢,放一些这个数据啊,这个我就随机的去做一些这个放置了,嗯,这个呢是一个啊。
01:10
嗯,比如这个12CC好,那方案以后放案以后的话,我们现在先简单的去做一个map啊啊这样的一个c out,先不去考虑如何去遍利执行,看一下这个结果,这个结果当中你会发现呢,诶好像不是按我们添加这个顺序来的啊啊当然这个呢,我们所谓的无序性呢,也不是说这个顺序不按它来它就无序了,还是只能你放的位置不是数组中一个挨一个从头放了啊那么我现在呢,不用这个叫哈奇map了,我现在呢,把这个map呢,我换成。对,叫你一个叫link的哈,Map。啊,用另一个哈ma以后,我们现在呢,再去做一个遍历啊输出你会发现呢,是按照我们添加这个顺序来的。就相当于这个link哈希map,它能够记录我们谁先加的,谁后加的,怎么做到这个事儿的,其实我们把它说清楚,大家呢,你去想link哈希set就也清楚了。
02:04
Link哈赛呢,咱们在PPT里边画了一张图,我们又带大家看源码,要看源码其实就是看它了,好,那我们这块呢,就稍微关心一下这个link的哈希map,哎,我们用了个它进来,另外以后我现在呢,是不是要调它的这个put方法,Put方法我们ctrl o一下,你写一个put发现诶没有。没有,那怎么解释?那相当于是是掉到它副类里啊对,那他副类的话呢,咱们这不是也看到了它负类就是哈奇map了,那相当于咱们再调呢,又掉回去了,诶那要掉回去了,那不是成了跟这个一样了。那肯定在某个位置呢,会有变化啊,这叫put,这呢相当于你link哈希,哈希里边调的还是这个put,这里边叫put v l,那你这块想,哎呦,这个put v l是不是重写过啊,你这块写一个put一个VL,发现嗯,VL。
03:03
是不是又跑这儿来了?这不还是哈,进map里的,相当于这里边没有是吧?啊没有的话呢,又跑到这里,跑到这里边你往下走,这个是咱们刚才已经看过的这个逻辑了啊,往这走,往这走,这个你要一开始是空的,也是reces,这个没有变化,然后再往这走,这个呢跟咱们一开始想的其实都一样。嗯,都一样,嗯在哪块有区别呢,你看啊这块呢,就是如果我们首次去添加。首次添加的话呢,这个位置上这个值啊,如果是个空空的话呢,这时候咱们涉及到往里边添加的时候啊,大家看嗯,一开始找这个位置上这个P呢,如果是no,相当于我们这时候呢,是不是要往里放了,往里放的时候呢,调了个方法叫new node,这个new node回到这ctrl o一下new。Node又一个node,诶你会看到我们link的map里边,它把这个方法呢给重写了,重写了是吧,那就意味着呢,咱们一开始调它的put方法,其实用的是哈,Map里的put又调了put v l还是用的它里的,但是你这块再去拗这个对象的时候,用我们这个具体一个元素的时候,我就拿一个新的方法覆盖你那这块呢,咱们就开始看它了。
04:20
理解是吧,那么我们现在造一个link的哈希map当中的一个元素啊,咱们呢,在哈希map当中那个元素叫node,这是JDK8 JK7的时候呢,这不叫NT吗?八的时候叫node了,那我们看这个link的哈西map说呢,我是new,它这里边怎么newde呢?我拗了一个link,哈希map当中的nri又nri了又啊,然后造了一个元素啊,然后这个nri呢,你看一眼这个entri的话呢,这不是就在这写的,说这个entri的话呢,还继承了你map当中的node。是吧,哎,继承这个node,咱们这个node的话呢,是咱们哈希map里的哈,我们这个node呢,是某一个元素,这个元素的话呢,可以指向它的下一个,所以我们会看到这里边有个这个next那个标识,就是一个单向列表的一个方式啊去存储,那么我们这个哎。
05:17
另一个的哈,Map当中这个NT在继承它的同时,那就意味你这里边的属性我也都能拿过来,就相当于我这里边是不是也有你这里边那个next。哎,就是你该形成列表还形成列表,但是在你的这个呃列表的同时呢,我又多了一对before和entry啊和after相当于我知道我这个NT的下一个元素的哎是谁,还有我的上一个添加的是谁,哎,他就多做了一个事儿。啊,就是这么个原因,所以呢,我们有了这个before after呢,就能够记录啊添加元素的一个先后顺序了,嗯,这个简单来说,我在这个PPT里边呢,你看做了这样的一个说明啊哈,Map里边的内部的叫node,哎,Node呢,它有一个这样的一个标识,我们会知道,因为你在数字的同时会形成这个链表,就是由它啊决定的,那么我们link的哈希map当中,它叫entry,它继承了哈希map中map中的这个node,那么在有它的这些属性的同时呢,我又多定义了两个变量,记住添加这个entry的前一个是谁,下一个是谁。
06:26
所以呢,我们就按照添加的顺序可以实现便利。啊,仅此而已。好,那么这样的话呢,咱们相当于把这个源码这块呢。哎,关于这个叫link哈希麦体能原理咱们就说清楚了,本质上咱们看到的一个结构就是它啊CTRLC。哎,源码当中,哎,我们会看到这样一个逻辑啊,这个逻辑就决定了啊,这里边呢,你会看他这个添加的时候,哎,可以记录啊。
07:00
嗯,这个在这写吧。说能够记录这个添加的这个元素的啊,一个先后顺序。啊,那么我们就按照这个顺序呢,可以实现一个便利,那么对于频繁的便利这样的一个诉求,我们可以考虑用link的哈map去替换哈map啊那这块呢,我们就诶彻底是说完了这个,说完以后呢,大家哎,我们再说一个简单的小事哈,就是我们看这个哈西set,当时咱们讲它的时候啊,我们new一个哈希赛,其实呢,就帮我们拗了一个哈希麦克。然后我们往这个哈希set当中去爱的元素的时候,那相当于我们把这个元素就放到我们的这个map当中了,那么我们放到这个set当中数据相当于map中的谁呢?看这。是不是相当于K啊,哎,对的,就是咱们说这个set里边放的是一个一个的元素,其实呢,你是把这一个一的元素放到咱们map当中的K的位置了,那么咱们map里边除了K还有Y6呢,Y6是谁呢?Y6就是它呗。
08:17
大家可能会大家觉得这个VALUE6是谁啊。我们可能会觉得说这个,因为map里边放这不键着对吗?键对,然后呢,咱们如果光考虑这个键,这不就是S吗?嗯,我们可能会说,那你就把这个Y6制成个no呗,是吧,哎,就这个no,哎它这块的话呢,它不是no,你看它是一个是不是敞量啊点开。哎,Object其实也没有特别实际的意义了,他只是想避免的让你去闹,万一你要是后边掉啊咋着的,万一要控制人的呢,是吧,啊,尽可能就不让你是闹了,况且的话呢,在哈希table当中,他本身也没办法让你放闹。所以说呢,就干脆都拗了对象了是吧,而且你有这个对象呢,咱们都怎么着,静态什么意思呢?哎,你这放了一个P,我指向了是这个VALUE6,我这又放了一个P,你往side里放,你就别再扭了,也没什么意义是吧,大家是不是都指这一个就完了,哎就这样,哎你光考虑这这就是一个哈希赛。
09:23
就行,所以说呢,诶,面试也不会去让你,哎说一下哈希set的底层实线啊,就会问你哈希大夫,外部你清楚sat自然而然啊,多看一眼代码就知道啊,也很清楚啊就OK了啊行,那这块呢,对家大家的要求呢,就是首先呢这块你能够表达出来,其次的话呢,能够通过源码去验证这个事儿,那就更好了,那就是你像我一样把这个代码呢走一下啊就行啊。
我来说两句