00:00
好,这呢是咱们说的这个相当于是第一个大的问题了,那第一个大的问题就是我们整个这个map它的一个呃,视线类啊的一个这个结构情况,那么第二个问题,我们先不着急去说这个哈希map的底层实现原理,我们呢,再讲一个内容,就是关于这个map呢,它这个KY6的一个理解啊,相当于这个map这个结构的一个理解。那这呢,我们切到这个位置。这个结构的理解,那这个理解的话呢,我们再去看这个,呃,它的这个时间类呢,大家会更清楚一些,那便于大家去理解,我这呢画了一个图。画的这个图,通过这个图呢,我们来说明一下,同时呢,大家去感受一下,它确实跟我们所谓的高中讲的函数呢,哎,确实呢是比较吻合的啊,那我们在这个map当中,我放了一些建筑,对,就好比是咱们刚才简单提到一下这个put方法,我呢put一个key put个value,那在我们这个图目当中,图当中呢,相当于我put的key呢,就是AAA,然后value就是那类似的,你再put一下它它它相当于我放了这个四个减持,对。
01:16
啊,四个兼职队,那么这呢是一个实际问题,这儿呢,你可以看成是具体的学生名字,这是他的这个考试成绩,那我们会发现呢,哎,不同的学生他是可以考相同的分数的啊这个A和BB呢都考了90分,Ya IG呢,就是我们的Y6是可以重复的啊,Y6是可以重复的,那么K能不能重复呢?对这块明确说了,这个K啊,不能重复,K是不能重复的,它不管不能重复,它其实还是无序的。啊,为了保证这个不能重复,同时呢,效率高一点,实际上呢,关于这个K大家呢,就可以把它看成是用谁去存啊,哎,对,就相当于是用set去存储的啊去存储的,那么我们key用set存,保证这个所有的key首先无序,就是你先先放进来的AA90分还是先放在BB90分,无所谓啊,是无序的,那么呃,他们的要求点就是不能够重复就可以了。
02:28
啊,不能重复,哎所有的key用set呢去存好看Y6这个Y6呢,哎,我们呢说可以重复是可以重复的,那么Y6有没有续呢。有没有序呢?其实就理解成就算是无序了,因为呢,你是这个K对应的这个value key的无序了,你过来这个value是不是也不可能有序了呀,对的,那这块你要说非得说这个value是什么特点呢?那只能说是叫可重复的,那但是它是这个无序的,那咱们现在呢,是不是也没有一种专门的结构说存储较无序的可重复的数据吧,诶,所以咱们就泛泛的把它称作就是用collection去存的。
03:16
啊,因为list呢跟set呢,它都不满足啊,所以咱们就泛泛的认为它就是一个collection,就是一个单列数据,哎去存的就可以了,成这是关于这个Y6啊,然后的话呢,我们在横向的去看一下,刚才说的是纵向它和它啊横向的来看一个K一个Y6,咱们呢,从这个put的角度来说啊,说我放了K,放了个value,大家呢,也也理解为说呢,我们叫双列数据,说呢,你放进去呢,都是俩俩的往里放,但事实上呢,我们这个map当中,大家放的呢,还是一个一个的数据。啊,还是一个一个的数据,这一个一个的数据是谁呢?哎,就是一个entry。
04:03
就是一个entry,是这个entry当中有两个属性,一个属性呢叫做key,一个属性叫做value,我们实际上往里边put的时候呢,Put的其实都是一个一的ntri是你put写的k value我在里呢,帮你先装成一个NRY啊,Entry里边呢俩属性一个叫K,一个叫V,是你放进来的,然后我们添加的其实是N。啊,这个大家去体会一下,那么我们现在呢,相当于是就有四个entry对象,四个ENT对象,那么我们关心的就是这个entry有四个了,它是什么样的特点。首先有没有序无序了,因为你像这个你放放进这个K都没有顺序导致的,我们这个entry呢,四个其实也就无序了。啊,那好,无序,那么重复吗?可重复吗?不可,不可重复K都不相同了,那么你再带个VALUE6只可能说更不同,对吧?哎,你像这个A这都没有重复的啊,你再配上一个你这块重不重复,它也不影响你整个,整个呢一定也都是不可重复的,那么这个ENT垂的特点呢,就是不可重复的是无序的,那么它可以理解成用set来盛装。
05:25
因为set的特点不就是无序的、不可重复的吗?对吧?哎,那这样的话呢,大家就能够体会一下,我们这呢提到了几个结构啊,相当于我们map当中的所有的key的特点,所有的value的特点,包括呢,所有的NT垂的特点就说完了,那这块说完以后呢,大家你再似乎呢,考虑一下跟我们说的这个函数的这个对比。函数Y等于FX啊,你对应着一条,比如说呢,我这就相当于是个线性函数了,就是其实是Y等于X啊,你也可以写成Y等于X方,那就是这样的抛物线,好啊,我们现在关心的什么呢?以这个函数哈,我们Y等于FXX啊我这呢,在坐标系当中体现为就是一个一个的点,对啊,我有对应的一个X1,对应着一个Y1 x2 Y2等等等等,那么这样的一个点对。
06:19
就类似于我们现在的一个KY6对。对,那么你的自变量X就相当于K啊,因变量这个叫Y,这就相当于这里边儿的VY6。对啊,就相当于这个好了,那你想想啊,咱们这说你这个KK呢,这叫叫什么呀,这叫无序的,不可重复的,就相当于我这块写好多的点对,好多的点对,那么你先写的哪个点对,后写的哪个是不是也无所谓啊,也无所谓啊,这个顺序呢,无所谓了,那么你看下这个X1S2,首先呢,这是不同的点对,不同的点对的话呢,你想这个X1X2呢,是不是自然而然的也是不相同的呀。哎,所以说呢,它这个自变量跟咱们说的这个特点一样,那么看这个因变量啊,那因变量就是相当于看这个Y了,这个Y呢,我们说X不一样,但是Y有可能一样,对,那就比如说Y等于X方啊,那你这个X呢是正一,Y呢也是一啊,X呢是负一啊,Y呢还是一,相当于这个啊因变量是可以相同的,这不跟这也一样吗?啊,然后整个来讲,你这样一个点点在我们这个坐标器当中,你要是个抛物线啊,这是一个点,这个点他们这肯定不是一个点了啊,这边也整体上它也是一个无序的状态啊,所以跟这呢实际上是完全匹配的。
07:38
啊,完全匹配的啊,需要注意的就是我们在这个呃,这个KP6当中是不可能出现这种情况的,我一个AA,我除了指向90呢,我还指向一个56,这是不是不允许啊,诶A你是几就是几啊,不可能一对多,那么在函数里边呢,也这样。函数里边的话呢,就是你一个X通过对应法则得Y的时候呢,Y是不可能说有两种情况的,函数的特点呢,就是可以多对一是吧,哎不能呢,一对多,哎跟这个呢也完全匹配,所以这两个概念是完全能够吻合的啊能够吻合的好,那大家呢,脑子里边有这样的一个图,咱们把这个事儿呢稍微描述一下,就是我们map中的这个key,它呢是无序的。
08:30
不可重复的。那么我们去使用啊,其实相当于是一个set呢,去存储,存储谁呢?存储这个所有的这个key啊,那么到底是什么set,那就看你这个map是什么map了,你是一个哈希map,那你就是一个哈希set,存我们的这个K,你要是一个link的呢,那就用也用link的那个set。哎,就这样就能理解了,然后再接着,哎,Map中的value,这个value呢,首先也是无序的,但是呢,它是可重复的。
09:11
哎,可重复的,那我们呢,就只说一下你这个value呢,去使用我们的叫哎collection,它呢去存储哎所有的这个value哈,然后再接着我们提到呢,这个一个建质对。哎,这叫间值,对啊,就是一个这个K和一个value,我们说呢,哎,构成了啊,一个ENT垂,其实构成了一个ENT垂对象,那么K和value呢,相当于我们这个对象的两个属性,这呢,先明确这样一个问题啊,构成了一个ENT垂对象,那么我们说map中的。这个entry它的特点呢,呃,由于我们上边的KY6有这样的特性,所以它呢也是一个无序的。啊,那你这个key都不一样了,那value呢,那整个entry呢,也不可能一样了,也是不可重复的,哎,那我们也是啊,就使用这个set呢去存储,哎,所有的这个entry。
10:11
这样。那这几个点的话呢,大家熟悉啊,我写它的过程当中,你就想象一下咱们刚才画的这样的这个图,嗯,那么这个理解以后啊,有助于呢,咱们后边呢,去写这个便利操作,哎,大家就知道呢,我们用什么结构呢,去装这些对应的数据啊就可以了啊那再多说一句,既然呢,我们map当中的key是无序的,不可重复的,那么我们再往里边去添加的时候。你添加的时候呢,是不是就不可能说填这种有重复数据的这个数据了啊,那你想想我们放在这个K,这个K呢,完全有可能是我们自定义的类,那你怎么保证这个事啊,哎,是不是就要求我们这个叫什么呀。A要求呢,我们这个K它呢所在的类呢要重写。
11:05
哎,是不是一个呢,叫ES方法和哈西扣的方法了啊,要重写这个结构。啊,要重现这个结构了,当然这块呢,咱们呃,你要说这个事儿的话呢,你得注意一下,这呢,咱们是以这个哈希map为例的啊,那你要是吹map的话呢,是不是又不管他俩了,那又涉及到你这自然排序定制排序是去整那个compare compare to了,对,所以这块呢,我们这明确一下啊,咱这是以这个。哎,这个哈希map为例说的,因为这个吹map咱们用的还是相对少一些啊,诶这块,所以这块呢,就强调这个事儿,这个呢是需要大家特别关注的。尤其是大家呢,你要把这个自定义的类的对象往这放,那你一定要去重写这个ES和哈eo的,因为咱们后边map还涉及到相关的一些方法啊,方法的时候呢,有的时候我们就需要去调用这个事儿了,比如说在咱们API里边你会看到呢,咱们会去判断。
12:04
啊,这个在这了啊,这不是有一个叫contains嘛,说呢我们在这个当前map当中啊,你是不是contains包含当前的一个K呢。问,你当前这个map当中的K里边有没有这个K,你怎么就没有?你是不是也得先去调那个哈希code,然后呢,找到那个位置发现真的有数据,然后再e cos一下才知道还包不包含,所以这块呢,也涉及到这个重启啊,需要注意下边,下边这个Y6呢,他说叫无序的可重复的啊,人家可以重复,那这边也有个方法叫contents y6嘛,说我这个当前的k value6当中有没有指定的这个VALUE6啊。那这个时候呢,需要我们这个类,你要是自定义的话呢,需要去重写什么呀,所在的这个类要重写还用重写还扣吗。不用了不用了啊,这个呢,就不用再去重写它了,它呢直接就判断一下这个equals了啊嗯,它的所在类要重写一下,这个叫equals啊。
13:10
像ES啊,其实本质上来讲,为什么它不用重写high code呢,就是咱们high code呢,主要涉及到存的时候呢,我们尽可能让它效率高一点啊,或者找它的时候方便一点,这个呢,我们VALUE6呢,因为你不就封装在NT当中了嘛,我去找这个VALUE6的时候呢,其实你去找entry,先去找他的key是吧。啊,或者你找K,然后去找这是get方法啊,那你找K找到K了,你就找到对应的那个value了啊,其实就比较方便了啊,这块呢,主要就哎判断有没有大家就把这个啊echo的方法去重写一下啊,那么呃这呢就封装在一起是一个entry了,这就不用谈这个事了,主要呢,关注于K和Y6啊这两个呃所在的类需要重写的相关方法啊。好,这呢,我们把它呢就停一下啊。
我来说两句