00:00
好,那今天呢,这五道问题呢,还都是考察咱们说的这个集合的啊,这张的话呢,这个东西呢,稍微多一些哈,其实呢,涉及到的这个代码上呢,并不是说特别多了,但因为呢,我们需要看一些源码的一些结构啊,包括呢涉及到跟几层数结构啊相应的一些内容,那我们分别来看一下,首先第一题说map存储数据的特点啊,以及呢,Key value entry存储数据的特点啊,这块呢,需要大家清楚啊,它相较于我们讲的collection collection稍微复杂一点啊,因为它涉及到诶key value2个数据了,那整整体来讲的话呢,这个特点怎么说啊,嗯,通常都来说先是就叫双列数据是吧,就关于这个map它的一个特点啊,双列数据,然后呢,存储的,呃存储呃这种建制对特点的数据,哎,K value6这样的,对啊,数据这个呢,就泛泛的写一下就行,然后下边的话呢,关于这三个结构它的特点,哎,这个呢得能写出来。
01:00
K,那这个怎么说呀啊,对它呢,我们往map当中放的这个K,它是无序的哎,不可啊重复的,对这个呢,我一写你应该知道,哎,什么叫无序性,什么叫不可重复性啊,相应的判别标准是什么?哎,这个都应该知道的啊这个其实就相当于咱们说的那个set辣就哎开发当中咱们用set呢,相对来讲频率上会低一些,哎,但是呢,你要是想理解呃,想能够正确的去使用这个map,那可能对这个set呢也得去清楚啊,因为map中的这个呃,Key呢,就是一个set了啊,那么是无序的,不可重复的,哎,相当于呢,它就是用一个哎set来存储所有的这个key啊,然后Y6呢。外列叫什么呀?哎,无序的可重复的对。哎,可重复的啊呃,这个K呢,咱们是不能重复的,咱们是按照他们考虑一下哈希值啊,诶考虑一下它的这E库的方法呀等等去在数组中呢进行存储,而这个VALUE6的话呢,实际上我们在存它的时候呢,不用考虑,哎这个k value6呢,整体构成一个entry,或者要构成一个node哎都可以啊哎然后呢,我们就是考虑这个K啊,看看它到底是怎么存这个VALUE6呢,它不用我们去担心啊,它呢相较于这个K来讲,呃,K无序了,它跟着也就过去也是无序的,哎但是它是可重复的啊哎相当于呢,我们这儿哎没有特别明确的一个结构存了,我们就说它只是用一个诶collection呢进行一个存储,嗯嗯,接下来啊KY6呢在一起构成一个entry。
02:42
啊,那这个NT的它也是哎无序的可重复吗?不可重复,哎对。哎,不可重复啊,这个呢,咱们调这个便利的时候也看到了,它底层呢也得用,呃这个set呢进行一个存储啊行,这呢就是大家把这个呢你得写出来,然后下边这个呢,是一道呃哈map的底层源码实现,这个应该是这里边这个比较大的一道题了,呃,大家写的话呢,你就挑这个重点去写,然后呢,大家互看的时候呢,你能够看出来对方写这个过程你看哪些呢?描述的还有点欠妥,哎这个呢,要求所有的同学呢,都必须要掌握,哎,咱能够表述出来,这呢,我直接写了一个扎二八版的,咱们上课讲的是先以七来讲,八的时候呢,我就说一下跟七的区别,哎,那需要大家呢,你能够整合出来,八应该怎么去描述这块呢?我就不在这儿多去说了啊,不在这多去说了,诶大家呢,一提到哈希map的一个底层实验原理这块呢,你要能够呃,脑子里边浮现一个图,根据这个图呢,你去答这个问题啊,这个图呢,应该是这样子的,首先是一个数组。
03:50
然后数组呢,这里边儿有很多的这个位置了,嗯,我们现在存的话呢,它有的位置呢,会出现这种链表结构,当然这个位置呢,也可能会出现链表结构,哎,这是这种的啊哎,那另外呢,可能会有这种哎树形结构哎这样特点的,哎就是你脑子里边呢,出现这样的一种结构啊就可以了,呃,这个哈奇map的话呢,底层实验原理考察的也比较多,实际上呢,你也能看到,在这里边呢,它存在的这个结构呢,比较丰富啊,有这个数组,有这个链表,这是我们昨天最后呢,呃,带着大家呢,稍微这个串了一下数据结构啊,那数据结构呢,我们说两类最真实的底层的这个结构,一个呢就是数组,一个呢就是链表,那所以呢,在我们哈奇map当中都涉及到了,那同时的话呢,它还涉及到一个更高级的啊,我们叫a dt了哈,叫抽象数据类型,在这里边提到一个树,而且是树里边呢,呃,这个比较特别的一种树啊,叫红黑树。
04:51
对宏位数呢,首先是基于叫排序二叉树,什么叫排序二数二叉术,就我们看到这个数呢,你往下这个放的时候呢,呃左边的往这放,呃右边呃小的往这放,大的往右边放,这就是属于都是有序的,哎这就涉及到我们说这个像吹side呀,Map呀,哎它得涉及到排序这样问题了啊,这是它的一个底层实验原理,这个呢就不多说了啊大家呢,需要哎能够表达出来,这你要不保险呢,大家回去的时候呢,你呃宿舍里边两个人是吧,你问问我,我问问你,那大家呢,看看这个彼此说的时候呢,都能不能正确的说出来啊,这个你别把这些很多咱们常见的面试题的这个问题你怼到这个最后啊就业的时候,那时候呢压力就太大了,那把这个呢,平时该掌握的这个内容啊,就都掌握了就行啊,后边呢,你要是忘了就复习一下就行,你要一开始就没记住,后边呢,想一下子能够说的特别这个这个清晰也很困难啊。
05:45
行,这个呢,就过了下一个说map当中常用的实现类有哪些啊,各自有什么特点,就是咱们讲这个map的话呢,这个大家呢,你需要对这个整体这个结构呢,得有一个熟悉啊呃,这个咱们讲课也好,还是大家呢自己学习也好,包括呢,以后你工作当中还会接触到很多新的一些框架和技术啊,那你呃,学习这个知识,就是还是以前讲过的那个问题哈,叫呃大处。
06:14
着眼是吧,哎,小处,哎,着手。哎,就这样个特点,就是呢,整体上去看一下啊,能够看到整个这样的一个知识的一个脉络体系是什么啊,哪块是重要的,哪块是次要的,相互之间的关系又是什么,这叫大出的这个招引啊,小猪找手,那就是具体来看一下,我现在要做一个某呃具体的功能了,然后呢,需要用到这个框架或者这个技术里边的哪些点,怎么呢,一点点去调这个方法,调这个功能去完成啊,需要做哪些配置啊,这就非常细碎的一些事情了啊,你不能呢一头扎进去,光去整这些事儿,然后呢,忽略了这个大方向啊,也不能光看大方向,眼高手低,然后呢不去写代码,这都是不行的啊,其实平时以后大家这个做事也是一样是吧?啊你不呢,光扎进去,一直闷头去做啊,你也得时不时抬起来看一看,做到哪儿了,还差什么,别人都干什么呢,是吧?啊,得都有这样的一个意识啊,那么这里边呢,就相当于我们得去接触一下啊,这个map呢,整体结构是什么?说开发当中用map用的比较多,那map是个接口,你肯定是用它的实验类了啊,那你得看一下啊,实。
07:20
类都有哪些啊,特点呢,是什么考的呢?其实就是咱们这个图。哎,上面这样的一个列出来这样一个结构啊,哎大家呢,你把这里边的核心内容呢,能够表述出来,哎写出来就可以了啊,像你得说清楚什么事儿,这里边其实也蕴含了一个面试题了啊,就咱们说的啊,这个哈奇map哈table,哎注意写的时候呢,这个T得小写,很多时候呢,你看企业里边笔试面试,他这个出哈信map和哈tableable有什么区别,他自己写的时候呢,他那个T都是大写的啊,你到时候可以给大家这个诶改成个小写的是吧,诶写的明显一点,让他知道你写错了啊,哎,这个T是小写啊,这个呢,不满足咱们说的标识符的的命名规范啊,这个他也比较老嘛,都老道呢,这连规范呢,你看都没有遵守啊,那么哈奇map是吧,这是他这样一个点不多说了,然后呢,High table这两个呢,基本上就是这种对应的情况,把它呢描述清楚啊,然后呢,再接下来关于link哈,Map又作为哈希map的一个子类出现啊,其实就是多了一对这个指针啊,我们构成这种。
08:26
双向链表这个结构啊,这个使得呢,我们在便历的时候呢,按照你添加的顺序呢去便历啊这呢就是这样个事儿,那tri map这呢又提到了一个排序的问题啊,就按照这个key啊,考虑它的自然排序,或者是定时排序,底层红黑数啊这呢是整个这样的一个结构,然后呢,这个关于他哈奇map,哈奇table啊,它底层其实都是数组啊,加上链表这样的结构啊,主体上他们就是一个安全不安全的,还有这样的一个小问题啊行,这个proper呢,其实也可以提一下。啊幺呢指出来就是这个high table呢,咱们倒是不用了,但是它的这个子类呢还常用,就是用来处理属性文件的啊这个要注意一下啊,咱们昨天呢,也写了个代码,那个代码呢,大家诶能掌握的你就掌握,毕竟呢里边还有IO6还没讲,呃咱们讲握IO6以后,后续呢,咱们在开发当中用这个配置文件的话呢,到时候就可以用这个pro了,成这是我们说的这个问题啊,就是把这个常用的结构要清楚,下一个说如何便利map当中的key value6对啊k value6对,就我希望呢,通过这个K,你能够把这个VALUE6能这能找到啊,那这个K呢,通过K,那因为着你这个K呢也得弄出来。
09:42
啊,咱们这个,呃,昨天呢,讲这个内容的时候也说过了啊,并不是说咱们在开发当中经常没事的让大家去便利map。这倒这倒不会说是,呃,便利一下输出一下,便利倒是会常用,但是呢,不会说经常去做输出的了,呃,咱们经常就是取出来它以后呢,你要么给我们前端这块去发,要么呃把它存到数据库等等这块呢,我们需要把这里边的数据呢,一个一个给它取出来啊,那取出来这个事儿其实就是便利啊,嗯,那其实咱们讲到这份上了,大家你想一想,这一章呢,咱们主体就讲了这样的三个接口啊,一个叫list,一个叫set,对一个呢叫map,这个呢说用的比较少,先干掉啊这个list。
10:24
这个list的话呢,我们叫单列数据,它叫双列数据啊,它有键值对它只有一个值,那其实你想一想,这个list呢,典型实现我们以呃release为例,它呢,呃,你要非要说其实它也可以看成这种像键值对这样特点,只不过这里边这个键是谁啊?对这里边这个键呢,它用的是index嘛,叫索引了,哎,所引呢就是从零开始的,就是你呢只管往里边去贴那个value。那你不用管这个K啊,这个K的话呢,咱们就呃自动的啊,你添第你艾特第一个的时候呢,这个index,所谓的这种加引号这种K啊,哎就相当于是零,你再加个Y6呢,我就让你是一啊234,那你也能看到这个K呢,它肯定也不一样啊,就是依次呢往后去走就行,我们主体关心的其实是这个value key呢,就自动的它通过诶索引的方式去维护,那我们那map呢就不一样了啊,Map的话呢,就可以看成是我们这个listen的这个升级版一样啊说这个时候呢,我们这个K啊更灵活啊,不一定呢,就是一个整形的索引啊,哎,我们可以是任何可以指定的类型,比如说我这个K呢,我就是string型,哎,我这个K我就叫name,哎,Value呢,就是我的名字就叫做Tom这样啊,这个接下来这个K的话呢,哎,我表述为比如说就是叫age。
11:48
嗯,我这个VALUE6 value6我也可以表示成一个字符串类型啊,比如21岁啊,相当于是加引号那种,21相当于我这个键和值,我都是四锥类型,哎这样子,哎,他这块呢,这个key就是更通用一些啊,我们可以不是这种呃整形的这种情况了,那可以是任何我可以指定的一种情况。
12:10
呃,这个Y6呢,就是我们这个对应的这个值,本质上来讲,本质上来讲呢,咱们map也好,类也好,其实更关心的你说是这种K还是Y6啊对,其实更关心的是value list如此,Map呢,其实也如此。哎,Map也如此啊,这个后边呢,大家会看到,就是我们像这种name,呃,这个复制为这个Tom age呢是21岁,其实你更更公更关心的是后边这个Tom和21,关心呢,就是你怎么找到这个to姆21那历史呢,只是说通过索引找,而我们这个map呢,哎,通过你前面这个K找,哎就这样一个区别,哎就这样子的啊,哎,所以这两种情况,咱们在开发当中啊,用的呢,稍微多一些,稍微多一些啊这个比如说就像这样一个页面,这个页面里边的话呢,咱们都知道了啊,你这不有好多的这个框嘛,一项一项的这个item的这个数据,那整体上来看的话呢,我们这个item有好多个是同一个类型的对象,你往上一划还出来好多,整体上来看他们用谁装。
13:19
是不是用list装这每一个,这是就一个数据,这个是不是就相当于是个有序的这样,这是第一项,这第二项,这接着往后放,是不是用list去装,原来不是用数组装吗?数组现在咱们它的一个典型替换不就是list吗?对,所以用list去装啊没问题,然后呢,具体到这里边,具体到这里边呢,我这个图片,我这呢是一个商品名称,嗯,我这是呢一个简单描述,这一个评价数,这是一个购买数啊,这是一个等等等其他的信息,那具体到这里边的话呢,这一个数据,你想我用什么装。是不是用map这个呢叫图片,它的key呢,你可以就称作一,呃,其实就是个URL了啊,它这个地址,然后它的VALUE6 value6呢,就是具体你这个图片的这样一个网络当中的一个地址,然后这个位置是你的名字,那你的key呢,比如就叫name value6呢,就是你的真实的呃,什么什么什么商品是吧?哎,然后其他的也类似,那么具体到这一项上,我们就可以找到你这一项的这个名叫什么,哎,相当于它有个标签一样啊,通过这个名我们去map当中找这个K对应的那个Y6,我把这Y6就塞到这,每一个都这样去装。
14:33
这里边呢,你想想,这里边这有好几项,在我们这个这一项就是相当于一个map了,至于说你这里边谁先放的,谁后放的有关系吗?在我们map当中没关系,因为咱们不像list,非常严格的说,角标零,角标一,角标二,还得通过索引去找,这就我们所谓的叫有序,那我们map当中,我根本就不考虑索引,我就考虑这个K找那个Y6,所以你这个先放谁后放谁无所谓,我反正就找那个K的Y6,哎,所以说它其实是无序的一种减值多的特点,我就找某一个叫URL的这个K对应的那个Y6是多少,你就去这里边找就完了,找到了把那个值放进来,其他呢也类似,所以我们就会看到典型的开发当中用list比较多,用map比较多。
15:22
而这个set呢,相对要少一些,这个set呢,你可以把它看作是我们更好理解map中的一个点,呃,因为map里边这个key呢,它就是一个set,为了更好的理解map,所以我们诶,你可以理解为讲了讲set这样子啊,能清楚是吧?啊这是我们开发中你就知道比较长的就是map和list结构啊。嗯,然后呢,说如何去便利我们的QL,对,这不就涉及到刚才举例子了,你这一项具体到这一项了,我们是一个map了,你得能够把这里边的呃,指定的这个P对应的value电能够一个一个取出来,这其实就是便利啊,只不是我们就不用去输出了,需要去给人家去set赋个值的啊,嗯,这个我也就不写了啊,这个大家呢,需要能够写出来,便利的话呢,是让你写这个代码的。
16:13
就是不管是key或者是VALUE6了,都要拿出来一种呢是调entry set,先得到这个entry构成的一个set,然后呢,你再从entry当中去剥离出来的,剥离出K和VALUE6那分离分离出来它,然后另外一种对,直接呢就找到这个key,找到这个K构成的一个set啊,找每一个key对应的value,这个我们有个get方法啊,这两种方法都可以。哎,都是可以的啊,行,这个最后一个呢,其实我想出另外一个问题,就是map当中的常用方法有哪些,当然你想出另道题的话呢,整个因为第二条第二道题又比较大,给大家呢,写的可能时间就有点紧张了,所以出了一个相对比较简单的啊这呢也是一道面试题啊,这个出现的频率呢就要稍微低一些了,这个咱们昨天也说过了啊,它呢是存储单列集合的一个接口啊,定义了一些规范啊,内部呢有常用的list和set接口。
17:15
稍微稍微多说两句啊,就别那写一句啊,Collection collection冒号啊,集合类啊,集集合接口没了,惜字如金是吧,哎,你多说两句啊,然后collections,哎是操作操作谁呀,诶对,我就听大家呢,你看要不要说这个map了啊,要说吧,哎要说上就是我们看API呢,你也看到它里边有操作map的方法,所以呢,它是操作collection collection和map的这个工具类啊,里边呢,有很多的方法,大家可以去调用啊,就类似于咱们前面说这叫ari一样,有哎A瑞一样啊,所以以后呢,大家会看到什么呢?就这呢是叉叉叉的一个类,然后你要看到说叉叉叉叉S你大概就知道哦,这可能是类似于工具类这样的结构,类似于工具类这样的结构,还有的时候呢,就是这个类呢呃。
18:15
这个类的话呢,它不能造对象,然后呢,他得通过这个带S的这种类呢,来帮他去造对象,比如调个静态方法来返回一个叉叉叉,类似这样的,还有呢,以后能见到什么叉叉叉的这个factory。那像这是干嘛的呀,某一个类的一个工厂,工厂就是用来生产东西的,咱们不也讲过这个工厂的这个模式吗?嗯,叉叉叉的一个factory,它的主要作用就是用来造叉叉叉的,所以呢,你要是用叉叉叉发一看,说诶这哥们好像这个构造器还是私有化了,看他的这个方法呢,还没有直接,呃提供一些方法,进代方法,让我们返回他的一个实例,诶发现了,诶提供那个叉叉叉factory。
19:01
那你就去这个factor里边去找,八成里边会有一些静态方法,让你直接调的时候呢,就给你返回一个叉叉叉了,哎,就类似这样的一些,就是我们在命名方方面的一些技巧,诶当你发现了这些技巧以后呢,诶它其实便于你做一些开发啊,包括呢,到现在大家慢慢写代码,现在可能还不明显哈,因为毕竟咱们讲基础代码量其实还相对有限,以后呢,这个写项目多的时候,代码量大的时候呢,你发现呢,咱们写代码的时候不一定大家比如我这有这个十行代码,我有十行代码,大家呢,其实不是说就非得按照这个顺序啊,一二三四五六七八九十,然后每一行代码都得记住这样去写的,应该不是这样的过程。哎,应该是什么样子呢?应该是你先头上呢,需要掉一个,比如说先造个对象吧,造个对象呢,我们主要目的呢,是拿着这个,比如对象叫小欧了啊,我通过这个小欧的对象呢,我要去调它的一个方法,然后这个方法呢,一看需要哎哟两个参数,这两个参数呢没有,然后去上边呢补,哎去提供这两个参数的这个操作,补这个操作过程当中,有可能又会涉及到其他一些结构,那再回去去补,补着补着,其实这里就出现就五六行代码了,然后呢,调这个方法呢,返回了另外一个类的对象,比如叫C,然后又通过这个C呢,去调一个方法N,调方法N的话呢,又这个方法呢有三个参数,然后在这个代码之间,你把这三个参数呢,你看你是到底是什么方法了,诶去提供这三个参数的,这个实参具体的值是多少,然后呢,你再放进来去执行啊,进行完以后呢,诶这个又得掉,这其实就构成了我们整体的逻辑。
20:41
所以大家写代码,你应该是抽离出来这里的核心,那就是首先造个对象,调这个方法,拿着这个方法呢,再去调另外一个方法,把这三个抽出来,其他这个代码呢,是根据这三个代码呢,往回去补,这样子你别呢,就是记住这种,接下来死记硬背,记这一行,记这一行,记着这一行呢,你都不知道他要干什么用啊,一到这哦,它要往这里放,你把这两个呢,先忽略掉,抽离出来这个核心代码回去去补,这个呢,减少你的思维量,同时呢,你能够把握这个重心,你到底是要干什么,是这样子去写代码的啊,那我上课写的话呢,因为有的时候咱们为了保证这个连贯性啊,有的时候呢会诶写完这个以后,咱们要做这个事儿,我需要干什么呢?啊,先把这个呢就写好了,这个还没写呢,其实呢,你写的时候你可以先写它,然后回过去去补它,哎这样子啊,这是就一些小的技巧,好这呢就是咱们说到的这几道这个小的问题啊。
我来说两句