00:00
好,这章的话呢,咱们就告一段落了啊,应该说呢,稍微有点难度啊,代码的话呢,倒是没啥了啊,这个下来呢,大家就得自己啃一下是吧。啊,其实你说怎么凸显出来你跟别人不一样呢。就是别人会的,你不会是吧。啊或者呢,反正呢,就是你会的呢,别人不会啊,这才凸显出来你的一个价值来了是吧?哎,所以呢,有些东西呢,还是要看一看啊,啃一啃。好,那这块呢,我们直接呢,来看一下这个复习和企业真题,然后找到我们的这个位置。诶,现在我们做一个复习哈,这一章里边呢,我们其实讲的这个事儿呢,是比较清晰的啊,就这样几个东西,第一个话呢,我们来谈一谈,这个叫诶数据结构啊。啊,其实这块我们讲数据结构的目的呢,其实也是为了更好的去讲我们这个集合的源码啊,同时呢,顺便呢,我们把这个数据结构里边的呃,一些基本的内容呢,相当于诶抛给大家啊,通常呢,大家要是买这个数结构的书的话呢,一般呢,他就知道都叫这个数据结构与算法啊结合在一起了,当然这个算法的话呢,其实也是一些比较基本的算法了,典型的话呢,就是一个诶查找的一些算法。
01:02
或者叫搜索的算法,另外一个呢,就是这个排序的算法,这都属于比较基础的算法啊,后续的话呢,当然还有这种很高级的一些算法,专门的讲算法的书啊,那也比较多,OK啊行,那我们这块呢,更多的还是关注于这个数据结构的一个层面的问题。啊,这是第一个点哈,然后第二点的话呢,我们就回到整个这个啊,这DK源码这个层面了,这块我们主要呢是讲了两个体系,第一个呢,就是list。啊,这个呃,接口下的实现类的啊,它的一个源码的一个剖析。啊,然后接下来我们,诶下一个体系呢,就是map接口下的实现类。那他的一个叫源码剖析。诶,那么关于这个set的话呢,咱说了底层就是map,所以map能弄清楚了,Set呢,自然而然的也就太清楚了,诶主要呢,我们其实讲的就是这样的两个体系下的这个源码的一个剖析情况啊。好,那这块我们首先来看这个第一个问题,咱们来讲这个数结构这块呢,呃,讲了几个事儿呢。
02:01
首先呢,我们说到的第一个问题啊,就是数据结构的。哎,他的这个叫研究对象哈。这样对象的话呢,我们相当于说了。三个吧。回忆一下啊,第一个呢,就是呃,数据跟数据之间的一个叫逻辑关系是吧。哎,数据间的。这叫哎逻辑关系,这个关系的话呢,我们分为了叫。都有哪些关系啊?啊,集合关系。这个就是最弱的一种关系了是吧,然后呢,一对一的,呃,一对多的。对多对多的,哎,就这样的这个场景啊,好,然后基于这种逻辑关系的话呢,我们讲的叫数据间的一个叫。哎,存储结构啊,或者叫物理结构啊。啊,存储结构啊,或叫诶物理结构啊好,那么这个存储结构或者叫物理结构这块呢,呃,一般的话,我们通常呢,就会说呢,有包含了这样的几个啊第一个呢,叫顺序结构。啊,第二呢,叫链式结构。
03:03
呃,还有呢,这个叫诶索引结构是吧,这个呢,就是诶索引结构啊,就我们这个像MYSQL这样的啊,还有呢,叫哈希的。这个结构是吧。好,这个呢,就是我们说的这样的几种结构了啊,然后呢,其实我们自己要理解的话呢,更多的习惯上可能是换一个维度来说了,比如说我们提到这个叫顺序表。这个我们可以列成这个叫角度一吧。哎,角度一。哎,这样情况啊,好,我们呢,更习惯呢,就从这个角度二的这个角度出发去说了啊,那么角段二的话呢,我们首先提到一个叫线性表。这弦表呢,其实对应的就是这个一对一的这种关系了啊啊这呢涉及到了比如说我们提到这个叫一位数组。是吧,还有那个呃,链表啊,在那就是这个哎,站结构,还有那队列。是吧,这个呢,都属于我们叫线性表这样的结构了,哎,线性表哎属于一对一了,一对多呢,就我们说的这个树形结构了,树形结构里边典型的话,我们就提到叫二叉树。
04:01
呃,二叉树里边呢,就很多种这个具体的二叉树了啊,然后呢,再一个呢,就是我们后面会讲的像这个B加树,这呢是针对于my circle来讲的啊,使用的叫B加树了,呃,然后呢,除了这个树结构之外呢,还有这个叫图模型了,图呢就是对应的我们叫多对多的一种关系啊。啊,这就过了,然后呢,还有呢,就我们这个叫哈希表是吧,哈表呢,对应的就是我们这个叫哈希set呀,哈希map呀,诶它使用的这样的一个底层啊。诶,OK,行,这个我们更习惯了,就从这个角度呢去做一个理解,然后第三个点的话呢,呃,既然呢,我们也明确了他们相互之间的一种关系和这个存储结构了,下边就涉及到了相关的这个运算啊。哎,对啊,相关运算啊,比如说你这块呢,去添加呀,删除啊,插入啊这样的一些行为啊,基于顺序结构和基于这种链式结构,它肯定呢是有区别的,复杂度呢也不一样啊啊这呢是我们说的这个场景,然后呢,诶整个下边的话,我们又呃单独的呃,当时呢,在这个通过课件这个层面哈,我们讲一下这个数。
05:00
啊数这块呢,大家就整体来讲做一个了解就行。啊就可以了哈,行,这是这个数,然后另外的话呢,我们前面呢,就提到了,比如说这个呃,异位数组,这个咱们就只有现成的了哈,也有这个链表啊占呀队列呀,包括呢,我们说这个二叉树啊,哎,咱们呢,就写了一下它内部的这个核心的这个node。啊,就是怎么呢,你看到这个结构这个node了,我们知道它是个列表了,单链表还是双向列表啊,怎么呢,就构成个站结构了,怎么就是个队列了啊,怎么能看到它就是个二叉数了啊这块我们相应的就是在这个课件的。呃,打开的这个第一个位置里边,呃,现在下边这块咱们就写了相应的一些代码啊,这个呢,大家呢,你理解理解就可以了啊,所以这块呢,我们是作为一个叫。要理解了啊,就是。哎,相关啊,数据结构的核心。哎,Node的一个设计啊。哎,它的一个设计啊,这块呢,我们主要讲到了,哎首先呢,这个叫哎单向链表,哎这个咱们说过啊,双向链表。
06:06
哎,所以这个讲完之后呢,我们再来看一下这个底层源码的时候呢,就直接呢一看哦是吧,就是这样子的啊,就找到共鸣了,然后呢,还有这个叫按二叉树,还有这个占结构啊,队列结构啊,咱们这当时都写过了啊。好,这个呢,就是我们说这个层次一这块呢,大家整体来讲呢,就作为一个了解就行啊,不用过多去关注,然后呢,这个list色这块呢,它的这个时间类啊,我们主要呢是讲了三个啊,这三个话呢,其实我们就可以呢,从一个面试题的角度呢出发。这面题呢,咱们前面也说过了,就是呢让大家呢去区分啊,A list vector和我们这个叫a link list。啊,它的这个三者的一个对比。呃,一般的话呢,在这个笔试面试当中,不会直接让你比仨的,一般呢,就是要么要么比前俩,要么比第一个和第三个。啊,这样一个情况,然后这块在对比的时候呢,大家如何去答这个问题呢?这个呢,我们说呢,就是诶层次一吧,哎,你在回答这个问题的时候呢,第一个层次先呢,把咱们第12章当中讲到的这个内容。
07:10
哎,把它先打开。诶把它先打开哈,在12章当中呢,我们讲到这个事儿了,先把这个内容呢给它抛出来,哎,相当于先呢,证明你呢。哎,这个呢是清楚的啊,这个呢,就是涉及到我们平时使用当中啊,你得会用。啊,这是我们说的第一个层面,这个呢,正常来讲呢,大家都会去说的,然后呢,你要光答这个事儿的话呢,就还凸显不出来,你这个层次呢比较高是吧?诶第二层的话呢,我们要是不是查看相关的哎,API的源码了是吧。诶这样相当于呢,我们要做一个源码这个剖析了,那这个剖析的话呢,你就具体看一下,他问的你是哪两个啊,你把它相关的源码呢讲一下就行,这个源码这个剖析啊,这不就咱们在这个14章章14章当中咱们讲的这个事儿吗。哎,那关于a release啊,这我们说的这么多,然后关于这个we相对来说少一点啊,然后呢,Link list这个相关的源码呢,咱们也都看过了。
08:06
啊,这呢就对应的,就看我们这个文档相关的这个信息就可以了,啊这儿呢,我们就见笔记,这个我就略了啊。行,这个呢,主要的点呢,还是大家呢,最好呢,你下来根据我们这里边儿写的这个文档的信息,先呢理解清楚,然后呢,自己啊看一下源码,这样的话你印象呢会更深刻。啊,包括呢,对方要是炸,你说是这样的吗。啊,你真的自己看过的话,你自己也会更有底气是吧,要不你没看过呢,总感觉差点意思。啊对,有点儿虚是吧。OK啊。行,就跟说这个,呃,比如说这个高考也是一样是吧,就是你再模拟啊。在模拟上十次你没考考过,就是你总感觉就跟真的不一样,是吧,其实你真正考过以后,你发现呢。好像也就是那么回事儿是吧。对啊,就是这有一个坑一样啊,就是你没有跳这个坑的时候呢,总感觉是万丈深渊,跳过去之后呢,你发现这不就是一个小坑而已是吧。
09:04
都这样啊。诶,所以呢,大家呢,就是可能那个高考之前的时候都紧张的一塌糊涂,都吃不下去饭,诶高考完以后呢,考了个学校还挺好是吧,然后呢,回去呢,给自己学弟学妹呢分享经验的时候呢,说哎呀我都当时就玩过来的是吧,嗯,风轻云淡的是吧。所以呢,就就跟大家你可能现在看我也是一样啊,你看我讲这个源码呢,似乎说呢,诶比较轻松一点是吧,直接说在我当初看的时候呢,其实我也挺痛苦的是吧,你这写的是啥呀,这是吧,然后呢,看不懂呢,适当的还得查一查。哎,弄清楚了,发现哎也就那么回事儿,挺简单的是吧,其实当时自己看的时候不也挺痛苦吗。都是这样的啊。啊,其实一说到这儿的话,我想起来我最开始讲课的时候哈。我最开始讲课的时候呢,你像现在咱们这个,呃,比如Java基础啊,或者其他一些课啊,我在讲的时候,其实基本上这课件我都不用看,你就拿一个T就可以现写是吧,现讲都没问题,顶多呢就是慢一点,因为你代码有些或者一些文字需要现写了是吧,现在都已经急熟了,都装到脑子里边了,当刚开始讲课的时候,即使你开发呢特别熟,讲课呢,你发现跟开发还有点区别。
10:14
因为你需要设计这个课,先讲什么后讲什么,中间呢怎么抛问题,然后怎么去设计这个练习是吧,这个跟开发不一样,开发你主要呢,还是就。对,解决问题为主啊,实现业务逻辑为主了,所以呢,印象很深,就我刚开始讲课的时候呢,呃,最开始讲我就连着讲了40多天的课啊。哇,当时感觉都快不行了都。啊,晚上的时候呢,备课备的特别晚,到后期的时候呢,那那十多天都是晚上基本上天都要亮了。啊,你就能看到这个已经泛白了,然后才开始睡。啊,然后呢,这个大概也就四五点钟哈,就开始睡,那时候还好年轻,要现在的话呢,我都怕起不来了是吧。然后呢,呃,这个七点多,七点半定闹钟就醒了,醒了起来之后呢,就洗漱完以后,然后就去讲课了。然后呢,夜里边其实你都睡不着,因为你想想那个高强度的,你去记背,我先讲这个,再讲这个,中间我有哪个题目,我要说什么话,是吧,都得提前准备好,你睡觉的时候呢,脑子里边全是这些东西。
11:11
持续很长时间是吧,大家应该有过可能有类似的经历啊,而且呢,第二天。当你要去呃,上班的这个路上的时候呢,都不敢走的太快。因为总觉得这个知识呢,就挂在脑袋上,走到一块一颠呢就掉了。是吧,会有这种感觉啊,哎,就跟大家现在你学这个渣一样,现在你觉得说哎呀这好痛苦啊,不行啊是吧,哎,你坚持坚持,其实你回过头来来看的话呢,也就这么回事。诶等大家呢,你学到咱们后期呢,比如说第五个月第六个月的时候啊,写这个项目比较大的时候呢,你回过头来,你再想一下,第一个月,你发现第一个月讲Java基础的时候,这一天也没讲啥东西啊,怎么感觉当时要死要活的都是吧。啊,就有这种感觉,那说明整个这个能力提升了嘛。啊,那这个过程呢,是要经历的啊。哎,就现在呢,你好像看着我这个咋样咋样,当初呢也都是一个小屌丝一样是吧。
12:05
哎,我也住过地下室是吧,啊,这个也也也也都是这样一路过来的啊,都一样。好这块的话呢,咱们答这个问题呢,就以这样一个面试题的角度去看就可以了,是吧?啊这样一点点的我们看诶搭建起来啊,就是要想凸显出来这个问题答得好,一定要往源码这块呢去靠去说啊。然后下边这块呢,我们说map接口下呢,实现类的一个源码的一个剖析,这个map这块呢,非常的集中啊,就是哈希map。哎,它的一个,呃,底层啊,源码的一个剖析。啊,这个要剖析的,你就从他开始创建对象开始,说到这个put操作put说完之后呢,你要愿意说说get,说说这个remove,呃,说一下也行,其实呢,整个原理一样啊,都是呢,我们要确定你要找的这元素,如果put呢,就是说都跟他们不一样,那我们就添加了,你要是盖的话呢,就找到跟你一样的那个,把它返回那个value了,木呢也是,那就得找到这个一样的。
13:03
我们把这个元素呢,给它删掉。所以最终的点呢,都是说put呢,就是找有没有一样的,而get和呢,就是找找到那个一样的,整个这个呃,具体的过程啊,其实都是一个套路啊。对,这个哈尼体内源码实现呢,这个大家是必须要掌握的啊。就哪怕呢,你没有翻底层源码,那对应的我们添加的这样的一个过程也得需要呢,会说。啊,这个说的时候呢,建议大家呢,你稍微的把它整合一下,说成是咱们这个八的。啊,就是你其实也比较简单是吧,就是你在说七的过程当中,看哪些跟八的不一样,然后你调成八的,就是以八为主来说,顺带呢,你再说一下七当中诶跟八有点不一样,比如说诶有红位数了是吧,为什么这块呢,有要加宏位数啊。像这个no的话呢,这个就是改了个名而已,里边东西也没改啊,你就知道呢,我们就统一了啊,在这个呃,单链表啊,双链表啊,各种结构中,我们习惯都叫节点了,所以这块它就叫node。
14:00
是吧,就这样啊,但是你会发现呢,我们link的哈希map里边那个还是叫N是吧。所以虽然没改全,所以这上都是小事哈,然后呢,这种七上八下的这个点的话呢,这个有个调整啊,其实这块调整的话呢,其中一个点也算是规避我们的一个循环引用的一个问题了啊,这个我就没有展开去具体来说了,所以呢,你以八诶为主去说啊,要更好一点啊,因为毕竟呢,我们开发用的是八级以上的版本了嘛。好,然后呢,稍微的大家这块呢,去熟悉一下就可以了,那就是另的哈希map它的一个底层源码的一个剖析啊。这个一般的话呢,可能很少去问啊,这个你自己清楚的,就是在哈尼ma的基础上又加了一个link啊双线列表,然后呢,下边这个呢,就是做一个了解了。啊,那就是对于我们这个set当中的是吧。啊,这个呢就是哎算是有两个哈,一个呢叫哈伊set,呃,Link的哎这个哎哈西set,哎它的一个底层源码的一个剖析。啊,这个呢,就回归到我们上面这两个呢就可以了啊行,这块我就不具体展开来说了啊这个呢在实际的呃,笔试面试当中,虽然你看我上面写的好像多点这块写的很简洁似的,但是他呢非常的重要啊,因为呢问的频率呢是极其高的,诶我呢可能就啊在面试的中呢,不直接问,你说呢数结构熟不熟,你说不熟,那没得聊了。
15:21
是吧,呃,那这个呢,我就通过问哈希map呢,来看看你对这个底层数据结构的一个掌握情况。啊,你要回答的不好,那我直接就感觉你韩信卖你用的都不好,对吧,所以这块就涉及到呢,就是在企业招聘的时候呢。这个咱们所谓的一些这种大公司是吧,诶还有这个中小公司,它的一个角度呢,可能不太一样哈,这种大公司的话呢,它更多的会会去关注呢,你知识的一个深度啊。而这个中小公司呢,更多的关注的是你知识的一个广度啊,就比如说中小公司要招聘的时候,他会问你说你做没做过啊,相关的开发啊,你说做过做过什么项目啊,做过什么项目,用过什么框架啊,说了说,然后基本上再问一下你项目的一个实际实施的情况啊,你负责哪块的,遇到什么问题,再问一下稍微的一些理论性的东西,他觉得诶可以啊,这就招了这个是中小公司啊,那对于这种大公司来讲呢,诶,你像发现这个BAT啊这样的或者这个。
16:14
TMD是吧?啊,这个是头条美团滴滴,那滴滴现在稍微的就低调点了是吧,哎,拼多多屁是吧。行,就相关的呢,这样的一些,这个咱们所谓的一些大厂啊,他在招聘的时候呢,你会发现他有时候都会从那个学校里边招聘一批学生,他说呢,刚毕业的,他也没有企业实际开发经验。所以他比较看重的就是你的一个知识的储备,或者叫学习的能力。学习能力强啊,那这块呢,他就更愿意要怎么样学习能力强呢。嗯,这个就所谓的就是就好比是呢,比如说他能上985,那你可能没考上,他就认为那个学习能力强,怎么讲呢,就是说同样的就是这个知识点学的时候呢,人家考分高,为啥考分高呢,它能解决难题。啊,那这块我怎么能筛出来哪些人的学习能力强呢,他就认为,诶看谁的这个深度呢,把握的更深一些。
17:04
啊,举个例子啊,你比如说A这个人,他呢,呃,比如说以Java这个系列的学习为主啊,他呢,可能没有接触过,比如说微服务相关的。啊,一些这个呃,项目或者这个框架呢,也不是很熟啊,就只知道呢,比较传统的,比如SSM举例啊,诶那么这块呢,他从这个知识的技术站上来讲的话呢,他只有仨,而B个B这个人的话呢,他可能说呢,啊为服务业接触过项目,还写过啊还有一些开发的经验,从这个面上来讲的话呢,A没有B好,但是呢,在大家都懂的这个层面上呢,A呢,他了解的会更深一些。啊,比如说底层这个源码的剖析啊,数据结构啊,他这块都懂,而这个B的话呢,他会用,但是你要让他输呢,他整不明白,你要写型,让他再往下深一点,他就差点意思了,那大厂呢,就愿意要这样的人。啊,然后呢,这个中小企业的话呢,你看你开发年也有确实呢也都呃技术也还可以,当然也不是说你这块呢一点深度也没有啊多少呢,基本的使用呢还是要会的,诶他呢就更倾向于要这样的人。
18:03
啊,那对于大厂来讲的话呢,就是你进来之后呢,他可以培养你是吧,你不会可以学嘛,学完之后的话,你不就可以做了吗。啊,那对于大厂呢,还有一个点就是他也通过他的这个福利待遇,他也认为能留得住你是吧,所以呢,你还可以呢,一直在这块呢,去晋升大厂不都有一个啊P级PGPG是吧?PGPG啊,一直往上晋升的一个路线哈,然后你中小企业的话呢,你说你要让A去了啊,他呢,通过半年时间技术都学到了,然后一看你福利待遇还不行,转头就走了。你还留不住他,然后实际上也没跟企业创建创造什么效益是吧,所以呢,这个B呢也都比较哎力量的企业,中小企业呢,比较务实嘛,所以呢,就是你过来呢,大家互惠互利是吧,你给公司创造价值,然后这块呢也有相应的薪资,你愿意走呢就走,我就再招别人。啊,大厂这块呢,现在他就来关注这个事儿,呃,另外一个点呢,就是大厂呢,它的业务线呢也比较多哈,呃,一个呢就是啊咱们说这个框架呢,经常换是吧,这个外不同的场景呢,我们有不同的需求,所以呢总会有遇到一些未知的一些啊知识点需要呢,个人呢去开拓的,所以呢,你的学习能力强呢,啊你这个开拓能力呢,就要强一些。
19:09
啊,这样一个情况啊,就是他有一些新的一些技术站,甚至呢,像一些大厂呢,还会封装自己的一些框架,这个呢,都需要呢,这些人呢,具备一定的这个能力,怎么认为能力强呢,就是你学习的深度更深,他就认为你的学习能力的要好一点。比供说这个高考这个平台,呃,都是这些知识点是吧,呃都是三年的时间啊,人家那出来了去985了啊,就认为呢,他们能够呃解决一些更难的一些问题了。所以为什么有的时候呢,这个呃,大家找工作的时候呢,会看你第一学历呢。啊,第一学历就是你本科毕业是呢是吧,然后呢,有的可能读研究生了,研究生呢,就属于你后来的这个晋升的了,因为晋升这块儿呢,你发现有一些牛人,他可能就不考研了,他不跟你玩儿了,是吧,所以这块你又看不出来谁强谁不强,但是高考这个场景呢,大家都是公平的,然后呢,大家都得往这块去挤,同样的这个时间。啊,比如说复读,顶多复读一年,当然有有几个别的可能复读好多年的哈,一般呢,可能第一年就都走了,就这三年的时间,看看谁强那就是谁强。
20:08
是吧,诶这个就更公平,考研的话呢,当然你可以好考好多次是吧,诶这个呢,就是有的人可能已经不玩了,退出这个比赛了是吧?诶所以呢,看第一学历有的时候啊。所以呢,在咱们找工作这个层面的话呢,怎么叫出身呢。啊,这个出身的话呢,就是你刚开始找工作,这时候出身就是你毕业的院校啊,你是985的啊,你甚至说呢,就是那么几所是吧,九大院校的啊呃,211的是吧,还是再往下排的,这个呢,就是你的出身啊,出身呢,你这个学校好一点呢,肯定找工作是要更方便一点,多少薪资呢,跟你往上跟你聊一聊是吧。啊,当然了,这个从权重上来讲呢,这不是最大的权重啊,最大权重一定还是你学的怎么样,可能占到百分之,比如说70的比例,剩下呢,20%~30%,其实有点高了啊,比如说60吧,然后呢,你的学历这块呢,我们比如分配10%~15%,当然有的学,有的公司更看重的可以比例更高一点,还有一部分呢,就是你个人的这种沟通表达能力。
21:03
整个给人展现出来这种感觉是吧,这个也蛮重要的,他看你,你看他两人看上对眼了,都好说是吧,看不对眼的话呢,这个怎么着也不好说啊,他要难住你呢,也是很容易的,所以权重比较大的肯定是学的这个怎么样啊,这毫无疑问了,你学的再好,然后呢,你学的一塌糊涂那。也也全是吧。OK啊行这呢,就我们说的第一出身啊,然后呢,当大家你比如说工作了好多年了。啊,工作了五六年了,甚至更长时间了,你要再找工作,这个时候你的出身呢,学历呢,是一个比重,但是这时候比重已经开始降低了,更多的就是你之前做过什么样的项目。你呢,在哪个厂工作过啊,你的这个背景呢,就是你的新的出身了。啊,这时候呢,如果你是大厂出来的啊,你的出身就感觉要好一点,或者说这个这个公司呢,可能名气不太大,但是你做的这个项目呢,可以。你比如说这个12306啊,当初呢,你参与过。啊,这个呢,是哪个公司呢,这个中标的,然后呢,可能我们都记不住了,但是呢,这个你参与的这个项目呢,是比较重大的一个项目也可以。
22:05
啊,这个呢,就是你新的一个出身,所以呢,如果现在咱有的同学呢,这个学历已经没法改变了,那你就把你这个出身呢,可以去聊一聊是吧。这咋撩呢?诶这个大厂你注意啊,像那个咱们说的BAT啊TMD啊,它的主要招聘的人员的这个年龄段呢,其实就在30岁左右啊。所以说大家现在其实都不够30岁,然后IG呢,就是这些所谓进大厂的人,他也不是说一开始就追进去了,他可能都在这个其他的企业中都工作这些年了,具备经历了,有经验有技术,能打能扛,30岁的时候呢,就是正精力旺盛的时候呢,大厂把你招过去了。他其实也最看重这个年龄段的这些人的经验和经历是吧,干上五六年再说是吧,哎,所以你这时候过去的时候,相应的薪资也是可以的,所以你想进大厂的话呢,哎,趁你现在还没有到这个年龄的时候呢,你这块你就储备了。到这个年龄的时候呢,这是他平均招聘的一个年龄段啊,你说你都35了,还想进大厂。那就算了。是吧,找个地儿呢,好好的养老不也挺好是吧?嗯,好这个拉回来哈,诶所以这块呢,这个知识的深度,像我们现在讲的这个呢,就属于深度这个层面的啊,不一定每个人都能上啊,你你得能顶上去啊。
23:12
诶忘了之前有没有给大家讲过例子啊,咱们好像是一三年还是一四年毕业的一个学生啊,就是我我带过的啊,然后就去那个京东了嘛,京东以后呢,后来这个大数据起来的时候呢,他后来还自己学了学大数据的东西呢,就做大数据了,薪资呢其实也不错,但是他学历呢很一般哈,然后呢,后边呢这个呃,因为这个京东这块大数据呢,需要人嘛,然后他就招了两个这个应届毕业生啊,这两毕业生呢,就让他带啊,然后呢,还过来找我呢,就是炫耀炫耀,说你看我手下带了俩清华的。啊,这俩是清华的啊,就是你看我学历是吧,我还不是一个正经的本科生,我现在能带俩清华的特别得意是吧,然后呢,这两个呢,就经常问他问题,他呢就很好的都解决了,然后过了俩仨月,发现这个事儿呢有点变了。啊,他他有一个问题,说这个呢,不能这样去解决,然后呢,改天那个,呃,这个手下带着哥们儿跟他说说呢,我看了看源码,这个好像呢,我们还可以改一改,然后能解决是吧,给他整的就一愣,完了,有学习的能力就凸显出来了是吧。
24:09
诶,所以这块呢,你得靠经验去怼啊,人家那个有能力的呢,他还是能上来的是吧。啊OK啊行,这个拉回来啊,这块的话呢,我们说一下就是这个呃情况啊,这个呢稍微难一点,但是大家呢,还是要整一整啊,这个真正当你整清楚之后,你发现整个能力呢,其实也在提升,不管是这道问题而已啊。好,下面我们来看下这个所谓的这个企业真题哈,说第一个说链表跟数组有什么区别。啊。其实都没什么相关性是吧,诶最典型的点呢,就是数组呢,在我们内存中,它是一整块连续的空间的分配啊,那我们的链表的话呢。他逻辑上呢,是连续的。什么叫逻辑上连续呢?就像咱们用这个link list。你用这个link例子的时候呢,咱们不是添加完以后你也有啊索引零索引一索引二,你以为它是一个挨一个,其实它底层不是是吧,就逻辑上呢,以为它是挨着的,其实呢,它是诶通过这种指针的方式呢,找到这种呃,空余的一个空间练过去的。
25:09
啊,然后具体这个区别呢,大家如果想说的说的比较细的话呢,呃,一方面咱们这个课件呢,最开始。啊,最开始的时候呢,这不是我都放了一些这个图吧,我是放到这儿了啊这是列表呢,这个就是数组的啊,你要这块看着不方便的话呢,你直接看咱们这个课件。诶,这个课件,这不我有一个思维导图嘛,诶这里边不光是数组和列表,其他的一些结构都有啊,包括它相关的一些添加行为啊是吧?诶删除行为啊,诶谁快谁慢啊,这块都有洗啊,所以这块我们就是诶。建议呢,大家你就看这个吧。CTRLC下啊。其实呢,基本的点呢,咱们也都清楚啊,只不过呢,大家呢,你想看一下细节的话,你就看一下它就可以了啊。这是对应的我们这个课件啊。第14章,嗯。
26:02
诶,这个课件啊。课件里的这个东西啊,好,下边这个说站是如何运行的。啊对,先进后出是吧。诶先进后出,其实这块这个问题啊,嗯,你看它是我是放到这儿了而已啊,诶但其实的话呢,它这个站呢,你也可以理解成就是咱们问的,也可以理解成是一个内存的一个题目是吧,因为内存当我们说有占有堆嘛。诶,我们之所以给它叫成站呢,是因为它是一个站的一个特征。这样的一个结构就是满足先进后出的,如果它要是一个内存层面的一个题呢,那这块呢,你答他的之外呢,是不是得再说一下,除我们调一个方法啊,这个方法的话呢,就是一个战争的方式去存在于这个战里边加载进来,哎,这一个方法对应一个战争。是吧,然后呢,方法调用方法就是这样,战争呢,就一个一个的这样去往上去累加啊,然后上面的方法调用完了就出战了,所以呢,他就是后调的就先出去,然后呢,把这个结果呢,还可以返回给他的调用者,就是你前一个方法。
27:00
啊,以此类推啊,然后这块还提到叫站管运行堆呢管存储。那咱们前面也提到过啊,因为new的这个结构呢,都在堆里边了,站管运行呢,就是我们程序在执行的时候呢,不就是调一个月的方法吗。啊,一个一个方法的调用,其实就是战争里边的这个战里边这个战争呢,就一个的近战和出战,所以呢,他是管运行的。OK啊行,哎,如果呢,它要是一个数结构的问题,那就是一个占,哎满足先进后路的特点,呃,它呢,哎我们说呢叫属于哎,当然咱们提过一个词叫做a dt哈。啊,Abstract data type叫抽象数据类型,什么叫抽象呢?就是说呢,真正存在一个说叫占了,而而是呢,我们可以使用像数组。或者是这个链表是不是去实现这样的一个站的特征啊。或者叫实现这样的这样的一个结构啊,我们就写那个push和泡方法就可以了啊,行行这个我们就说到这儿啊,然后list呢,这个源码的个分析默认大小,这都很清楚十是吧。
28:01
扩容机制。125倍。是吧,哎这样的情况,所以呢,大家你会发现呢,像1.5倍哈奇map呢。两倍吧。诶还有点区别是吧,呃,因为它这块你看扩完以后呢,呃,它这个扩充两,呃扩充1.5倍,那就是扩了呃一半是吧,而这哈map呢,你要是扩一倍的话呢,它不是还有一个临界值吗。零业值0.751成,其实又往回缩了一点。是吧,大概这样的情况啊。好,嗯,为什么是十,为什么是1.5倍。所以这问的也挺无聊的啊,对对,为什么是原码写的就是十是吧,哎,那为什么不是20呢,就统一上的一个,觉得十个呢,我们平时用的话呢,可能放的都不多呗,是吧,那就用十了呗。这个呢比较清楚啊,咱们就略了。说呢,底层是如何实现的?啊,这个咱们不是已经讲过的源码分析了啊,就一个一个往前去往里边去放,然后呢,当诶真的要满的时候呢,我们才考虑扩容是吧?诶这样个问题,诶通过这个呢,在说的时候呢,我们大家呢,你还要再去提个点,就是我们讲release源码时也提到过了哈,这个呢,我们在实际开发中呢,建议大家你考虑一下我们这个release另外的一个带参的构造器是吧。
29:15
这个呢叫型的一个叫capacity city是吧,这个capacityac呢,就直接指定了它底层数组的一个容量了。对,如果你要确定它有多少个,诶,尤其是比较多的时候呢,建议你用它避免了我们不必要的扩容,还有复制的这个行为啊,那要说到这儿的话呢,你要注意一下,就我们这个哈希map啊。Map的话呢,它也有这样的构造期,但是它这个构造期呢,这个capacity外里指定的不是底层的容量啊。对,咱们刚才看原网不也看到了吗?它呢一定要啊,把里边定义的那个也叫capacity了,它得转化成是二的指定次幂是吧。哎,对的啊。好,下边这个说它这个remove后边几个元素该怎么做。就前移呗。前移是吧?啊,因为release里边是数组结构啊,所以呢,你把前面的删了,后边几个呢都得往前移。
30:02
简单来说就这个了啊下边呃,它的区别这咱们也说过了,就一开始在造对象的时候,哎,他这个区别是吧。那一开始的时候呢,初始化数组一个没有,哎,所以呢,它有点我只能说叫类似于哈,呃,一个呢相当于是叫恶汉式的,1.8呢就变成了叫懒汉式的。啊,延迟我们这个数组的一个初始化啊。啊,速度和一个区别。这个挺有新意的啊,数组和release的区别。啊,一个可以扩容,一个不可以扩容,那他也能扩容啊。你把它控制完以后呢,你心脏那个速度再付给他嘛。这不就是俄的做法吗?诶动态的也也没说到本质,咱们面上看到就叫动态速度,就是说呢,你只需要呢往里添,你不用管会不会超,其实呢,说的再直白一点俄呢,不就是针对于数组的这个增删改查操作,我们做这个封装而已嘛。是吧,你原来呢自己呢,需要去填,自己呢,需要去删,删的时候还得往前移是吧,现在不用管了,你直接调它调方法里边呢,我凡是针对数字操作我都封装起来了。
31:10
你也不用担心超了。因为抄的时候呢,我们就自己呢,给你再重新造一个是吧。哎,对,所以说它的本质上来讲呢,就是俄呢,它就看作是对数组的。对对数组的叫常见操作的一个封装。就可以了。啊,对外暴露的话呢,就是都是增删改查差长度,包括便利啊这样的一些操作,那我们便利的话呢,你不也可以呢,像数组一样使用角标的方式来便历吗。是吧,你本质上就是个数组,所以这呢是最核心本质的这个点。OK啊行,只不过呢,就是这个操作,因为我们用的是极其频繁了,所以呢,你不需要呢,用第三方的一些API去做这个事儿了,直接呢,我们Java呢,就把这个类呢,直接就集成到JDK里了。啊,直接呢,从Java这个层面呢,你就可以去使用啊,说什么是线程安全的这个list。
32:03
啊,什么是限制安全的list这个问题问的。说哪个类似呢?那就是vector了,什么是呢?那好像在问你怎么算叫线程安全是吧,这个问稍微有点含糊了啊,诶这个呢,你要从安全不安全的角度来讲呢,这个VR呢,它是一个线程安全啊。诶,它是没问题的啊,那就意味我们这个release呢,它是一个线程不安全啊。哎,线程不安全OK啊,那我们要是想把它变成个线程安全的呢。对这块我们可以使用呢,叫呃,使用同步机制去处理是吧。呃,去处理就可以了啊,这个呢,至于说你是自己包还是说呢,我们这个用collections都可以啊,因为它collections里边也就是包了一下而已啊。行诶说到这块的话呢,稍微的啊,因为我下边哈map这块呢,没有写哈,这个我们当时讲这个collections时候呢,不也提到了说这个呃,说这个哈奇map了是吧。
33:01
这个哈,Ma的话呢,它也是一个线程不安全的。诶,它也是线程不安全的,然后我们在实际开发的时候呢,如果涉及到做线程问题了,这块我们也会考虑呢,是不是使用同步机制来做一个处理啊。对这个肯定就安全了,呃,但是多少啊这块这个同步机制啊,它的这种呃,处理限量安全问题呢,就特别的。叫什么用力过猛?就是相当于处理完以后呢,整个就是一个串行的一个效果了是吧。对,咱们前面也讲过这个同步的一个这种特点哈,哎,这呢是一个诶。重来一下啊,诶这呢是我们一段共享的这个代码了哈,这个线程这个线程,然后在这个同步代码过程当中呢,就只能是一个单线程的,就串行的第一个过去之后呢,第二再进来啊,一个挨一个这样这叫串行。啊,这种是安全,但是它这个并发性是不是就很低了。诶所以呢,我们在诶讲到这个真正这个并发这种行为的时候啊,我现在有好几个事故或者要县城来访问了,诶这块呢,我们其实呢,不一定非得要使用这种同步的这种特点,因为它的这个并发性呢,就。
34:04
就极差了,或者换句话说都没有并发了。都是串行的是吧,诶那以后呢,我们讲到这个。Doc的时候啊。哎,Guc啊,这呢就是Java呢,专门讲这个并发处理的这个相关的API了,这个到时候我们会讲一个叫concurrent。诶conar呢,叫哈希mapar的话呢,这个就是这个CC,就是这个C,就是并发的意思,并发的一个哈希map,使用它呢来去处理哎相关的这种多线程问题,哎暂且呢,咱们就先不说了啊,大家知道这个事儿就行了。好,包括呢,我们在讲数据库的时候,也会有同样的问题哈,多个事物,或者你理解成多个线程来操作数据库了,都操作一张表,那这块呢,也得防止它出现一些安全问题了,这我们到时候得讲锁机制了啊,各种锁啊。好,下边的话呢,我们看这哈依麦法底层实验原理,你看。相当多的公司在问是吧,所以这个呢就略了是吧,诶咱们已经说过了啊,这块我们也说过啊,建议啊以。
35:04
啊G8啊为主说明啊。嗯,为主来说明。行,然后呢,你顺便呢,再把这个七里边儿那个区别点呢,稍微提一下啊。下边说它这个数值是16,临近值12是怎么算的?对,这个初始值呢,我们就看到这个底层有一个属性是吧。呃,16的话呢,这个是就是从底层这个源码的构造系统看到的啊。啊,勾搭七中是吧。诶,看到的他相当于拿了一个叫默认的一个初始化的capacity负责这个值哈,然后这个12呢。12呢,我们称为它叫hold是吧。哎,称为它啊,它呢是使用叫数组的长度,再去乘以呢,叫加载因子得到的是吧。哎,这个加了音叫load factor。诶,就通过他呢才得到的啊行。
36:01
嗯,在下边儿哈,说这个哈尼麦的这个长度为什么是二的这个四米方。哎,幂次方。对这块呢,就是我们,诶刚才也提到这个事儿了啊CR,我们来一个叫哈希map。哎,比如我们进来啊,然后呢,CTRL f12啊,找一下这个构造器啊,构造器里边呢,我们就以它为例吧。哎,这个位置你看我们写个叫initial capacity,哎,比如这个位置我就写的15,你以为呢,底层创建的数字长度15,其实不然。掉到这个时候呢,你传的这个是15。嗯,在这儿是吧。哎,把它呢,传进去,然后走过来。这块一看大家看的有点多了啊,其实这块呢,就经过一系列操作之后呢,它还是要把它变成相应的二的次密的方式啊,这就是相关的这样的一个操作。这个大家可能觉得有点懵,这个呢,其实就是一个纯算法的一个操作了。我我就不在这儿专门去说了啊,OK,行,那为什么他要这样去做呢。对,方便我们去计算一下这个在数组中存储的那个角标的位置,咱不是用的取用的不是曲模,用的是那个,哎,跟LS减一求个与运算是吧?哎,那LAS减1LAS那就涉及到它就一定是二的。
37:12
整数次幂了吧,然后减个一的话呢,它就一定会出现呢。哎,对,全是一的这种场景了吗。啊,你像咱们说的这个15。哎,15,我们看这个不就长这样是吧,哎,31。哎,三一它不就长这样吗。哎,就这样,或者换句话说呢,你看他要是全是这种一的场景的话呢,咱们不就是这个怎么讲,哎是比如说这个所有的这2.04幂,2.14幂,这个等比数列前一项和的求和公式嘛。啊一减QQ2嘛。上面怎么着?A1A就是一啊,一减Q的N次方。是吧,然后这块不就二的N次方减个一吧。这个呢,就是前一项和一个和嘛。
38:00
前项的一个和,然后咱那个不正好是LAS减一,这也有个减一,那正好那个LAS呢,不就让它充当二的N次方吗。哎,所以呢,就我们这个长度呢,就是二的N次幂啊,为了方便呢,我们去计算底层的这个数组的索引位置啊。嗯,计算这个要添加的。呃,元素的是吧,底层的这个,诶索引I是吧,这块呢,我们选择的是这样的一个场景啊。好,下边这哈map呢,是怎么计算哈希值和索引的扩容机制,怎么解决哈希冲突?啊计算哈西值这个咱们说过了啊,先是一次哈希二次哈希是吧?诶所以的话呢,在七里边呢叫index啊在八里边呢,就直接呢就求与了是吧。那这个咱们都说过了啊,扩容机制呢,就是默认扩容为原来的。两倍。得注意,这个是两倍了。你怎么记呢?你就记得像俄瑞斯呢,就是1.5倍是吧,然后这块呢,它要也扩容1.5倍,再加上你又乘以个0.75才算你的临界值,那其实呢,你这个也没增加几个元素是吧,所以这块你可以理解成呢,就是空中两倍。
39:09
啊,就是稍微多一点。你可以这样去想啊。好,然后呢,什么叫哈希冲突呢?哎,这个哈伊冲动呢,注意它有好几种情况啊,其实我们就理解成了就是大家要放的这个索引I的位置一样了。咱们就理解成叫一种哈气冲突,哎,我在这个课件里边呢,其实有去写这个事儿哈。比如在这个七的时候啊,这个往下走啊,这块你看哎,我这也写了,说呢都统称为呢,叫哈希冲突啊,你比如说本身呢,要放在这两个元素呢,它的哈希值一样,这个哈希值一样,注意是哈希值一啊。对哈,只一一样,然后也有可能是不是你诶哈只一不一样,然后呢,经过二次哈希以后一样了。所以这也算。然后还包括呢,就是我们这个算完以后的话呢,就是哈移值呢啊哈值二呢,可能不一样,但是咱俩呢,最后算完之后都在索引I的位置上,是不是就是求了一个这样的一个运算判断它在索引的位置上,就是总之呢,只要你在这一之上的,我们都算是叫哈西冲突了。
40:10
OK啊,那要问说怎么解决海事冲突啊?就是咱俩冲突了,那怎么办?哎,这个怎么办,不就是咱们讲的那个添加过程吗?还有只要一样了,我们再就是你看相应的位置一样了,我们再怎么办是吧,最后呢,不行,就ESE如果说还一样了,那就是替换了,不一样了就添加呗。是吧,哎,七是头插法,八是尾插法是吧?哎,相应的八里边还有一个红黑树,哎,这不就相应的解决的这种方案嘛。啊,解决了一个冲突的问题啊。好,这个呢就列了啊好,然后哈金mapb呢,底层是数组加链表,有数组就很快了,为什么加链表。这个问的其实有点莫名其妙的啊,你要说呢,数据加链表加宏位数,有数度和链表已经很快了,为什么加宏位数?
41:00
应该更高级一些是吧。说有速度已经很快了,为什么加链表?换句话说,加链表可能还会更慢呢。是吧?嗯,但是这个我们为什么要加链表呢。那没办法呀,哈西,冲突了吗?冲突的话呢,你我就要放这儿,跟你还不一样。那你要么呢,就像咱们说像Python类的这种方式,就是他就去下个找一个位置空的是吧,这个位置要有的话,那就再去后边找,找到一个空的位置呢,就放到这儿了。那要么的话呢,就像我们现在,那你只能是就放这儿就放这儿,那只能是链表了呗。为什么家里面?没有办法。是吧,就得加啊。嗯,这个呢,就是因为呢,我们产生哈希冲突了是吧,当然你不能,呃,面试的时候你说没有办法啊,因为呢,产生了。叫哈希冲突是吧?哎,那么解决啊方案啊,这个呢,就是使用这个链表的方式啊。
42:00
哎,使用裂变方式,然后保证呢。哎,保证啊。哎,你现在要添加的这个元素。哎,添加的这个元素,哎,它呢,相当于是仍然。诶,仍然是不在我们这个索引I的位置上是吧。OK啊,现在我们要再去找的话呢,比如我们想get了,我想remove了,然后你还是按照原来那个哈希的算法去做,最后呢,我还是能找到这个索引I的。啊,这就OK了啊。好说这个哈,Map呢,为什么长度达到一定长度说就要转换成红黑数,你看这个问题就稍微的好一点是吧,为啥转换成红黑数呢。呃,因为这个红黑树它的一个,我们说呢,这个便利也好,查找也好,它的一个,呃,常用操作的复杂度,时间复杂度。对,是这个O呢,哎,Log以二为底啊,这个我们说叫N的对数了,所以就log n了啊,那它呢,是比我们这个单向链表的。
43:02
哎,O。N是吧,要效率要高啊。啊,这个说什么时候空中为宏位数,什么时候又返回给咱们说过了是吧。对,这个。索引I的位置啊,给咱们已经说过了啊。At的位置的这个链表长度。啊超过八,然后呢,且数组长度。啊,超过。啊,64。啊,或者这个叫达到了啊,达到这个64,哎,那就呃需要呢叫呃索引I位置。哎,所以I位置呢,哎要哎就是变成红位数啊。哎,变成红绿数行,那什么时候呢,又退化呢。哎,当这个所压的位置。哎,的位置这个,呃,元素的这个个数呢,要低于60。哎,要呢就是哎红黑树。
44:03
啊,结构转为啊单向列表。啊,为什么?对啊,为什么这个呢,就是节省空间啊。诶这个呢,你就说我们是看这个源码看的,诶明确说了,说这个node呢,它要占据两倍的这个普通node这个空间啊,所以我们要节省空间了。啊,这也是解决了,我们为什么一上来你不是说它好吗?你说它好,你为什么不直接呢,从数组加列表改成数组加红位数呢。是吧,你就干脆别用单列表了啊,还是呢,出于这个空间的一个考虑是吧,达到一个平衡就行了,说呢,在这个1.8中啊,相对于它有什么变化,好处在哪?这咱们不都已经讲过了,诶这呢提到了有四个区别是吧。啊,这个我们在讲这个婴儿剖析的时候,1234啊,这个注意一下啊。这个我们有现成的,我就直接拿过来吧。好,然后下边这个map的一个get方法,一个原理,这个我们讲了put以后呢,Get类似哈。
45:04
只不过呢铺呢是我们找到不一样了,我们就要添加一样了,就要替换,呃,钙的话呢,就是一定要找到那个一样的。啊,没有找到,没有找到那个。诶,所以这块我就大家呢,就参考一下咱们这个put这个就可以了啊。好,下边又提到这两个方法啊,说它俩的区别是什么?他俩也没什么共性啊是吧。对,这个呢,就是判断两个对象呢,是不是相等,它呢,就是计算一下当前对象,通常根据它的属性呢,算一个哈希值是吧。对这个我就不用多说了啊,哎,功能呢就完全不一样,所以它俩这个生成算法方法呢,怎么重写。啊。阿里校招的是吧。呃,生成算法就是呢,我们通常这样说吧。哎,通常呢,这个,嗯,进行E。哎,判断使用的这个属性。
46:01
这样说吧。进行equal的判断。啊,使用的这个属性。通常呢,我们也都会让这些属性呢参与到哈希code的计算当中。啊,也都会啊参与到。诶,哈希扣的。在这个方法的这个计算中。这个能理解吧。哎,通过这样一种方式呢,尽量的,我们说要尽量是吧。保证。哎,这两个方法的一致性呗。哎,这样就可以了啊,哎,为什么说这块呢,就要这样呢,你比如说我们这个呢,叫AA了,然后这个呢12岁,这个呢叫BB呢,啊也是12岁。好,那么从我们这E的角度来讲呢,这俩如果属性都参与了,那显然呢,这个不是ecos的,然后你再算算哈一的时候,你说我光拿年龄去说,那就成了一样了嘛。那不就导致他俩不一致了,所以你这块E中你让谁参与了属性,那我们尽量让哈,也让谁参与。
47:00
尽量呢就保证一致性了,那从这个一致性的角度来考虑的话呢,你自己写总归呢,不如我们用某种算法来的靠谱,那哪一种算法呢,那就是我们自动啊,比如说使用idea生成的时候。诶自动生成,它这个自动生成呢,其实这个哈,Code里边就蕴含了一个相关的一个统一的一种算法。啊,自动使用相关的算法。诶,他这个大概思路是怎么做呢?我稍微说一下啊,这个如果是A这个12的话呢,比如我们先拿这个12来算,这个12就是个数,我先让这个31呢去乘以这个12。然后得到一个结果叫result,然后呢,拿着这个result的话呢,我再让31呢去乘以这个,比如这个A1呢,啊,我再匹配上我们这个result。哎,这样呢,再得到这个新的这个道。啊,就是不断的这样去迭代一下,这样啊,31的话呢,它是一个质数是吧。哎,在计算的时候呢,这个就这个数,你不用选太大了啊。就是哎,这个数我们乘以个数,这个数如果大的话呢,太大了。
48:01
计算这个结果就会很大是吧。啊,就是吸收度呢,就会更好一点,那太小的话呢,这个吸收度呢,又不够,找一个居中的一个数就行啊。好,这是它,然后呢,说一下它俩的区别,这个是以前的老问题了啊说呢,诶看这个题说呢,这个E4。啊,Equals还写错了。说equals相等,哈希值一定相等啊。啊,这个呢,这个一般是。一般是啊,一般E要相等,说明呢,一般就是你要比的这个属性呢,都一样是吧,一般属性二一样,这个属性还参与到含义值计算了,那通常是不是都是是啊。当然这个事呢,你完全都可以改,你说不一定,那当然不一定了,你这个哈希的时候呢,你就return一个,比如说另一个全局常量,哎哎加加谁调都不一样是吧?对你想让它不一样,那很很容易啊,当然呢,我们这块呢,咱就说开发的场景啊,Ecos呢,用的属性了,既然都已经相等了,那还一直你要参运算,那一般都是相等。
49:03
是吧,反过来啊。反过来不一定了是吧。诶说这个哈伊值呢相等了,说ES一定相等吗?这呢就不一定了。就像我们说的,你这两个属性呢,比如说都有各自俩属性,这个叫A是吧,这个叫12,这叫B,这个叫11,我只是举个例子啊,简单你要做相加的话呢,其实明明不是一四,但是你算完的数呢,可能恰好一样了。这也是决定了为什么咱们在哈希map里边呢,说明明这两个哈都一样了,你为啥还E一下呢?我就怕万一出现这样的问题。是吧,所以还是一样了,还是一样,我们还得看一下是不是真的是一样的是吧,所以这个呢是不一定啊。哈塞存放数据的方式啊,就是底层。来使用这个哈希map是吧。哎,那下边呢,你就说一下这个哈希map就可以了啊。说是如何保证数据的元素的一个唯一性。就不能重复呗。
50:01
那秦始皇还是说他?因为我们在添加的时候呢,我们只有不一样的才能添加进去。什么叫不一样呢?就是你哈一指要么不一样。啊,要么还是一样的库,次数不一样是吧。嗯,OK啊,所以这块呢,咱们也就略了哈。好用哪两种方式呢?实现集合的排序啊,这就是我们的两个比较期嘛。诶自然排序,还有这个叫诶定制排序是吧,这个事儿啊,然后呢,关于这个吹菜的吹map上,咱们就没有专门去说了啊这呢也不是咱们开发的重点,实际呢,开发重点呢,都在这个排序方式上,然后呢,这个底层要问的话呢,为什么面试也不爱问呢?因为他呃吹麦吹菜的就是红黑树啊。红运数这块的话呢,我就不用去问他了,因为你哈希map里边不是本身也有红运数吗。哎,可能有一些呢,极个别的一些公司会稍微的问一下你这个红位数呢,了解吗?大概什么情况呢?啊,这个大家作为客户的一个拓展的情况啊,愿意了解的你可以看看相关的一些帖子啊等等的东西啊,这个咱们呢,就超出咱们现在要讲的基础的范围了。就不先去说这个事儿了啊。
51:01
好,整个呢,我们就过掉了。
我来说两句