00:00
复习一下我们昨天讲的这个集合,集合呢我们就已经讲完了,哎,今天呢,咱们主要讲的是泛型,泛型讲完以后呢,我们再讲一部分的L流,哎泛型呢是一个新特性,内容呢相对来讲少一些,集合呢,这里边内容呢就比较多,咱们呢之前是讲完这个S了,诶一上来呢,我们开始讲的map map呢在咱们开发当中也是非常重要的一个结构啊,这块我们讲的也比较深入一些,好我们看一下都有哪些知识点,首先提到这个map呢,它的常用类的一个结构,所以咱们考试的时候呢,也考大家了,就刚才说的这个事儿,就是这样的一个结构,这个呢需要大家掌握啊,那先泛泛呢我们说一下就是关于哈希map的底层实现,哎把它呢也粘过来啊,CTRLC好,这呢就是这样的一个结构。哎,整个呢,我们再把它变小一点啊,12太小了,14稍微往前一点啊,这呢,通过这个你看清楚到底是谁谁的这种继承关系啊,对应关系,这三个并列,这是它的一个子类,这个呢是它的一个子类,这样子就行好这呢就是我们提到了它的底层这样的一个,呃,不是底层了啊,就整个这个map呢,它的具体实现类,这个实现类呢,是有哪些特点,这个大家呢得清楚,这个都得清楚才可以,下边呢涉及到几个典型的面积,这个呢在这写了一下,哎,CTRLC。
01:32
那CTRLV这个哈,Map呢,那我们就也放这了啊嗯,这里边的话呢,高频的那就是它了,这个呢,现在出现的频率已经很低了,这个呢,后边我们讲到这个,呃,项目需要用到的时候呢,我们再提到另外一个叫current head map,其实讲到这个guc的时候呢,我们会讲到这样的一个啊结构啊,所以暂时呢,我们就先不说的这么厚了啊,这个机合咱们讲的东西其实也不少了已经,那么再往下我们呢,需要大家来理解这里边这个主要的结构了,呃,这个这个哈,Map的这种使用,当然讲它之前呢,先关于这个map,它的key value6啊有一个熟悉这呢,我们就提到了map当中的这个,呃,具体的KY6,咱们考试也考的这个事儿。
02:17
那这个括号呢,又没有了。嗯,啊,以它为例,然后呢,诶,这提到是K,这是value。嗯,一个减直对,然后这是它,嗯一个减这样啊好,这呢是我们说的这几个点,这几个点啊,这是一个哎,CTRLS1下行这呢,咱们说的这样的几个点啊,需要大家这个清楚的啊呃,对应的这个图式,在咱们这个PPT当中,这个图,这个图呢,这个大家呢,诶想我们这个map中的P或者是Y6的时候呢,诶脑子里边你浮现这个图行这就OK了,接下来对于map,对map来讲,大家呢,需要掌握的第一个层面就是呢,你能够使用它的常用的类去调相关的一些方法,完成我们这个相应的一些功能,所以第一个层面呢,就是常用的一方法呢,你得去熟悉啊,能够直接去调,先别着急。
03:29
可以说看底层哈希ma源码呢,这是第二个层面的要求,第一个层面先会去调这些方法,这些方法呢也不少,咱们呢,总结一下,主体用的呢,就是这里边标识出来的这些天山改查没有插入,因为它没序了,哎,长度遍历,前面的话呢,我们讲list,讲stream buffer,实际上呢,都是这样的一些方法啊,天山改查差长度变历,这是比较高频的一些方法,这些方法大家呃,尽可能的就不要去再看API了,拿起来就能写的这种就能掉,那其他的一些方法呢,你可以看一下API过了,在下面我们这呢,就提到这个难点,属于第二个层面的要求,我在这个collection collection这块这边写着的啊,第一个层面呢,大家你得先知道呢,用哪个API调哪个方法,那这个呢,是比较基本的要求,第二个层面呢,你再考虑这个底层的结构如何啊,那这块呢,我们关心的呢,主要就是哈希。
04:29
诶map,诶哈希map呢,在JDK7当中这个实现原理,这让咱们上课写的这个代码,呃,写的这个这个过程啊,就整个呢,从这一直到哎到这儿的一个过程。这里边大家注意一点就是什么呢?嗯,你更重要的呢,是能够把这个过程呢理解了,理解以后呢,呃,你照着我这个过程呢,自己呢给它复述出来,就是咱们考的这个第二道题,大家呢,尽可能得能够去复述清楚,至于说呢,有没有看源码有经历了,或者说呢,诶你能够这个看得懂了,试着呢走一走,因为以后呢,咱们讲框架呢,也会带着大家去看一些源码,这个呢,以后大家也要有这样的一些能力,呃,你看看这源码,不管是知道这个东西怎么用,你也得知道它里边是怎么写的,就更深入一层的。
05:20
嗯,那有能力的话呢,大家尽可能也是自己去看一看啊,实在上你感觉这个时间有限,或者这个看起来有点实力,或者第一个层面呢,掌握的时间还不够呢,那这块呢,首先你得能够说说出来,咱们通过源码呢,是验证咱们说的这个过程,这些事儿的话呢,不是说百度出来的,说这个啊,这个百度怎么说,咱们就怎么写,不是这样子的,而是呢,我们就是来看源码,源码怎么写的,我们就怎么说,哎是这样的,这里边有一些呢,它合一起啊行,这个就意思这种递进的这个关系啊,大家看一看这个过程就OK了。好,然后呢,在JDK8当中,我们说相较一七呢,在底层呢有一些变化,那在这个变化的点,这个我们下边也写了一下,主要提到了这样的几个事情啊,CTRLC站过来啊,哎,就是一开始new对象的时候,里边呢没有造,还是跟这个我们说的release有点像啊,这个时候的GDK8当中,相较于七呢,呃,在造对象这块呢,造数组这块它更像是一个男汉式,对,嗯,这个跟我们这个release在八里边呢也是一样的套路啊,然后另外呢,它底层这个结构呢,名变了一下,它改成叫node了,其里边呢叫entry,里边呢包含的信息其实还是一样的。
06:38
信息还是一样的啊,就是对于一个node来讲,它包含的信息呢,有这样的几部分,第一部分呢,就是它的哈希,就是我们算了一个哈希值啊,然后它的一个K,它的一个value,还有它的一个next。你想想是吧,因为在我们这个哈,Map当中某一个位置上元素,它有可能是不是指向下一个元素,它得有这个具有指向下一个元素的能力,就是你得有一个属性叫做next这名了啊,当然类型的就是你自己这个类型呗。
07:10
嗯,这个呢,我在这个PPT里边,呃,这个这不是在这也写了,在这写了,当然这个写的话呢,还是依据于我们本身的源码啊ctrl shift t这个你看一下这个叫哈奇map,哎,点开它,点开它以后呢,CTRL找一下这里边这个node,点开node,这不就这四四个事吗。这个呢,你看这个JDK7,只不过呢,它叫N垂了啊,也是这四个字啊一样的啊,就是它都会存这几个结构啊,就这四个结构啊成然后呢,下边呢,说七当中数组加链表,八里边呢,数组加链表加红位数,其实这里边呃,关于这个链表这块呢,还有个点是吧?嗯,我在这没写,在咱们说代码的时候呢,这不都提到了,就是链表形成的时候呢,这个咱们提到一个词叫七上八下。哎,对啊,咱们也说了,呃,另外呢,什么时候变成列表,这有个描述,这个我在这也补一下吧,这个我写成个叫4.1啊4.1啊,这个类型不一样了啊,这个类型4.1,那就是这个链表结构时。
08:21
哎哎,或者叫形成链表时。练。表是啊,这个我们这提个词叫七上八下啊,具体的就是说JDK7啊是这个新的元素指向,嗯,这个原来旧的这个元素,这呢这个八呢,呃,是这个旧的元素。指向新的元素,哎这个咱们元素啊,这这个咱们上课讲的时候呢,说这个事了,只是说呢,我没有把它这个明确写出来啊,然后再下一个呢,就是说在什么时候呢,它会生成这个链表这个结构,这呢,我们就提到了这样的两个这个事儿啊,第一个就这个链表上的这个个数呢,超过八了,但总的长度呢也超过64了,这个时候呢,我们会以红黑数的方式呢进行存储,哎这样一个点啊哎这个CTRLC,咱们把这个代码这块呢也哎做一个微调啊CR微一下。
09:27
行啊CTRL,那再接下来的话呢,关于我们看源码过程当中会提到这样的一些属性,这些属性的话呢,我们都会有它的一个简单的一个叫法,这个大家呢,你得能够知道啊,默认的其实叫法其实就是它这里边儿的这个名了,就这名啊,默认的一个初始化容量,默认的加载因子啊,临界值啊等等等等这几个值的话呢,初始的值是什么样子的,大家呢得稍微清楚,那需要关心的就是这里边儿这个加载因子,这个加载因子的话呢,如果让你去描述或者说一下什么叫加载因子,它影响的是什么。
10:02
这个能够去理解,诶咱们上课呢,带着大家也说了一下,我在这个PPT当中这呢也有关于这个加载因子的一个说明,这个你看我这里边写的还稍微比较丰富一些,大家下来呢可以看一看的,在这里边加载因子或者叫附载因子,附带因子的大小对哈希map有什么影响,咱们上课呢也讲过了,它呢就决定了我们哈希map当中的数据的密度啊,那个数要比较小啊,比较小呢就是很快呢就会去扩容,密度呢就比较小,那你这时候呢,这个相当于我们这个数组空前呢就要多一些,利用率差,那你这个因子要大的话呢,发生碰撞,这个碰撞呢就是说哎什么叫碰撞,对,就是这两个呢,K明明呢不一样,但是呢,嗯,你把它俩放到同一个所谓的同一个数字的那个位置上,一样以链表的方式去存在了,把这种呢就叫做碰撞了啊,明明不一样,按说呢,它俩应该。
11:03
放在数组中的不同的索引位置,但是呢,由于你这个数组呢比较小嘛,那这块呢,我们这个对比的时候发现它俩就是放在同一个索引位置上了,呃,这个时候呢,就叫做碰撞啊,碰撞的概率呢就高了啊这是这样个问题,哎,这样一个描述其实非常简单啊,只说呢,大家能够呃利用一下这里边的一个语言呢,你去描述一下,便于你去理解啊,就是大家呢,这个学习这个知识,目前呢,应该能达到一个基本的状态是什么呢?比如说我要找个同学呢去答这个问题,说呢,附带因子的大小对哈希map有什么影响,这个同学在说你呢,至少应该有个能力,你得能够分辨出来他说的正确与否。比如说有五个知识点,他说了仨,哎,你得知道啊,这仨他说的是对的,他说呢,这仨里边呢,其实两个对,那个呢说错了,这是最基本的一个要求,你得能够分辨出来,哎这个他说的对或错,如果你要分辨不出来,说明这个知识点你也是盲点啊,这是第一个层面,第二个层面呢,就是说,哎要是让你说啊,你也能够表达出来,你能够把它说全了,这是更高的一个要求。
12:09
呃,咱们呢,现在讲课的过程当中,其实更多的关注呢,就是大家呢,脑子里边能够想清楚啊,能够去写,其实表达这块呢,是忽略了啊,那大家呢,其实这个也要有意识无意识的呢,去说是吧,去表达啊这个东西呢,你不能说啊,这个清楚这回事儿,但是说的时候呢,词汇量太太少啊,不能都显而易见是吧,啊这这不行哈,有些呢还是要表达的。嗯,好,这是这个事儿,那主体上关于哈希map呢就讲完了啊,嗯,咱们下边呢,就看那个源码,那那个呢,就大家下来呢,你自己看一看,然后接下来呢,提到这个link的哈希map啊link哈map呢这呢大家做一个了解就行啊,本质上来讲我们说这个link的。咱们看他调的方法都是用的哈希map里的,哎,Link的哈希map它呢,底层使用的使用的这个结构。
13:04
与咱们的哈希map相同啊,为什么呢?啊,其实就是因为你这个link的哈奇map,它就是继承于我们的哈奇map。哎哈西买画啊,但是呢,既然呢是一个子类呢,得稍微跟父类呢有点区别,那么我们提一下这个区别就在于在于什么呢?就是我们这个link的哈,Map它自己呢内部定义了一个entry。嗯,区别就在于它呢,诶内部呢,提供了呃一个结构啊,这个结构呢,就叫做一个ENT垂,然后呢,它去替换咱们哈希map当中的这个叫node了,那那么他们二者的区别在哪?这个呢,哎,我也咱们也带大家看源码了,这呢,我把这个源码的核心呢,这不就粘出来了,区别呢就在这,那么哈希map当中node呢,只有这几个值,咱们那会也说了,在link达含奇map当中呢,它叫entry,它既乘以node的基础之上呢,它呢又多了一个before和after啊进而的话呢,我们就知道,哎每一个元素咱们都说是个N垂了,我就知道呢,这个N垂的前一个是谁,后一个是谁,这样的话呢,相当于我们就哎能够按照这个添加的顺序呢去变利。
14:31
啊对于嗯,这个这个往前一点啊这样嗯这个按照添加顺序序便利啊能够实现了,就是因为呢,它这有一个这个代码核心呢就在这儿呢,啊好这呢就过了,再往下的话呢,关于这个叫tri map的使用,这个呢,咱们就不用过多的去说了,只需要呢大家清楚tree map呢,我们需要啊指定它key是这个哪种排序方式了,那所以主要点呢,其实就是这块提到的这个事情了啊CTRLC那核心的代码呢,我也就不往这块去粘了。
15:10
啊,主要呢,大家其实需要掌握的还是自然排序和定时排序的事儿,只是呢,这两种排序方式在我们的吹map或者吹set当中用了啊,用了而已啊,咱们在这个collections当中,你估计也见到,呃,进行sot方法的时候呢,也可以去用一下这个排序啊,诶,它就是不同的场景下去使用,关键的点还是在这儿,如何呢?去给对象排序啊,过了再下一个关于properties的一个使用啊,这个呢,大家就知道它可以用来处理这个,哎,这个属性文件啊,具体的一个操作呢,咱们这写这个代码,大家呢,目前先体会一下,然后考试我也没考大家啊跋竟呢,这里边有一个流,咱们还没有讲啊,还没有讲,行,咱们讲L流这一章呢,大家就掌握了啊,就会了。到那个时候呢,这个代码你可以回过来写一写啊,掌握了啊,行,这就过了。
我来说两句