00:00
好,那么接着的话呢,咱们来看下一章,叫做集合框架,这里边呢,跟集合相关的这几章呢,实际上是有12 13和14,中间呢,我们穿插了一个叫泛型,这呢实际上是一个新特性啊,这个新特性呢,当然它不止使用在集合这里边,在其他的一些类里边,或者接口里边呢,也可以使用。只不过呢,哎,在通过我们讲集合的方式呢,去熟悉啊,去学习这个泛型而已,好,然后呢,这三章呢,大家发现呢,这个章节就比较多一些啊,这个第12章呢,主要我们是讲一些API的使用,这章也是我们平时呢,相当于接触最频繁的这样的一些场景啊,然后第14章的时候呢,我们谈一谈集合底层的使用的这些数据结构,包括呢,借着我们讲集合呢,咱们把这个数据结构的内容呢,相当于相对应的一些内容呢,我们补充进来,OK啊。好,中间呢,穿插一个我们讲的这个泛型,看在集合当中是如何使用这个泛型的,那首先呢,我们来看一下这个第12章叫做集合框架啊,把它呢,我们打开。
01:01
这张呢叫做集合框架,首先呢,我们先清楚这个集合是来解决什么问题的。哎,我们这里呢,就看到了跟数组的一个对比,所以说呢,它也是我们要讲的一个容器,哎容器呢,就像我们生活当中,哎,你装不同的东器。啊,我们呢,就需要不同的容器了,这是生活当中容器,那在我们这个程序当中,我们如果呢,需要对多个数据呢,进行统一的一个管理存储了,这时候呢,我们就需要呢,Java层面的这个容器,那这个容器呢,就是我们之前讲的像数组是其中的一类,那除了数组之外呢,我们这一章呢,其中要讲的就是还有哪些丰富的容器,那就是集合。啊,那么在这一块的话呢,我们就有相关的一些类了,整个来体现呢,就有一个框架结构。啊,然后呢,以这个跨界结构出发呢,下边有好多的这个类啊,都是呢相关的一些容器了啊,那么在讲这个集合框架之前呢,首先呢,这里边儿提了一下,前面呢,我们讲的数组啊,那数组呢,在存储数据方面有哪些特点,包括呢,有什么样的弊端啊,基于什么样的点,我们这里呢,要讲这个集合呢。
02:08
是吧,就是这个问题啊好,那回到咱们这个我们的idea这个层面啊,我们来看一看,这里边儿这个报错呢,是因为我这呢使用这个单元测试了。啊,所以这块呢,我呃,要么呢,咱们就像原来一样是吧。啊,这块我们先过来选择一下当前这个module,然后在这个位置呢,选个加号,选择我们当前这个是吧,把它呢改成是一个compel OK一下,哎,这就没事了。哎,他又没事了啊,下边这个呢,也报把这个我们先打开。这个呢,我就选择另外一种方式吧,这个我在有网有网的情况下呢,Alt加回车选上它,然后再回车,哎,这就搞定了是吧?哎,两种方式啊。好,那这呢,我们就直接呢,来看一下这个teacher这个module,打开第一个问题。啊,就刚才提到了,首先呢,诶,我们可以考虑的容器呢,呃,以前呢讲过数组,现在呢,我们要讲的是集合啊,你要集合类也行,集合框架呢也可以啊。
03:04
所以这里边儿还要强调一个点,我们现在考虑的这个容器啊。它指的是内存层面啊。也就是说有的同学呢,会说,哎,数组集合是不是还有我们以后讲的数据库呢。注意,这不是一个层面的,数据库呢,是我们持久化层面的。就是你断电了,然后呢,这个数据呢,也还在是吧,而我们这里边儿这个数组和集合呢,你要一断电了就不在了啊,因为呢,它是在内存中存储的。啊,内存中的数据呢,它都是一些临时要处理的一些数据了啊,一断电就没有了啊,所以呢,它跟数据库呢,注意不是一个维度啊。行,那就好比是呢,我们是先从数据库里边把这个数据呢,你可以先读到内存当中,数据库中的数据呢,你可以用数组去存,也可以呢,用集合去存。啊,是这样的一个关系啊。好,那首先的话呢,我们说一下这个数组啊,大家也回忆一下啊,在存储数据方面的特点和弊端,这个特点呢,就是谈不上说非得是优点了,当然也可以是优点啊,哎,这个你看都有哪些点呢。
04:07
回忆一下。啊,诶同学提到一个长度的问题了,是吧,咱们前面讲到过,说数组呢,一旦初始化,其长度就确定了。这算特点还是算弊端呀?确定确定了,其实就算个特点吧,它长度不可变,咱算上一个弊端吧,是吧。这边写一下啊,说数组一旦初始化,其长度就是确定的。啊,这个你不能说一确定了,就就是弊端了,就就只能算个特点是吧,一旦初始化呢,其长度就不可变了。哎,这个呢,咱算成是一个B端,比如说这块呢,我们初始化长度是十,现在话呢,我十个已经存满了,我想再加几个不让加,那这个呢,觉得差点意思是吧,这个我们看成叫一个B端了,还有吗。啊,数据的有一个大家发现呢,它有个特点是吧,我们当时讲的时候呢,说数组呢,我们new的时候呢,它在堆空间当中是一整块空间。
05:08
然后它里边呢,存储这个数据呢,有相应的特点。要依次紧密排列。并且呢,是有趣的是吧。哎,这呢,我们写这呢三个特点。数组中的多个元素是依次。紧密排列的啊,这个呢是有序的是吧。其实还有一个特征呢,是可重复的。就相当于呢,你这里边儿呢,比如说一,第一个元素呢是一,第二个是二,第三个呢,可能还是一啊这个一跟一呢,我们就看到是一种可重复的了。啊。这个呢,我们可以理解成呢,它是一个特点,然后呢,呃,由他出发呢,我说这块呢,可以引出它的一个弊端。就是我们在实际开发当中有一些数据呢,它可能不需要紧密排列。看一眼不需要你是有趣的。哎,他呢,甚至还有一些过分的要求,说你不能放重复的是吧。
06:02
那么也就是说呢,对于我们实际在存储啊内存中去存储数据的时候呢,可能呢,这个我们这个数据的特点呢,就比较多样,那我们这个数组呢,只能够适用于这样的一种特征的。对于其他特征的场景呢,它就不太实用了。哎,对,就是它这种存储数据特点的这种单一性是吧。诶数组中存储数据,哎特点的这种,诶单一性是吧,哎这个我们说呢,对于比如说叫诶无序的说叫不可重复的啊这种场景的多个数据。就无能为力了。哎,这是它的这样的一个点是吧,好,那么接着我们再去考虑还有其他的有特点或弊端没有。啊。啊,有同学提到点说这个,呃,数组呢,我们查找查找。查找怎么了?叉叉通过角边就行是吧。哎,其实由这个引发出来的一个点呢,什么呀,就是数组里边,大家回忆一下,咱们呢,讲完数组这个初始化,哎,常用一些基本的六个操作之后呢,我们就讲了一些数组的常见算法里边呢,比如说求最大值啊,最小值啊是吧,总和呀,包括排序啊等等,你会发现呢,我们这个速度里边啊,咱们可用的一些方法呀。
07:20
很少是吧?或者说印象当中也没见说有什么方法。就是通过一个角标,然后有个属性叫LS,然后呢,关于求最大呀,最小啊等等的是不是都是我们自己去组织的相关的一些操作了是吧。哎,对的啊,所以这儿呢,我们可以看作是一个弊端了。啊,这个呢,就是数组中是吧,可用的。啊,可用的这个方法或者这个属性呢,都极少。当然这里边呢,再强调一下,咱们前面讲object的时候啊,数组呢,其实也可以理解成是继承于object了。所以我们在里边那方法呢,他也能用。但即使这样的话呢,其实也不多。
08:01
或者呢,中的那些方法都是比较通用的,对于我们数字来讲呢,其实没有专门针对于我去做的一些操作了,是吧。诶,所以这块呢,其实也还是比较有限的啊,可用的方法或者属性呢,都极少,具体的这个需求。啊,都需要呢啊,自己来组织这个相关的这种啊,代码逻辑啊。这个呢,也可以看作是我们的一个弊端了。接着再思考还有什么特点和弊端。啊,类型这块是吧。啊,类型这块怎么了。啊,数组这块呢,发现呢,就是我们声明的类型,比如我声明是int类型了,它这块呢,就只能放int类型是吧,我声明string类型的话呢。就只能声明这只能让放这个string类型的。这呢算一个特点还是算一个弊端的?既是特点,又是弊端。
09:03
啊,这个单一性呢,说的不是说这个类型的单一性,是说我们这个数据的特点就是你只能是有序的可重复的。啊是这个意思啊,然后这个的话呢,这个类型上呢,它就是相当于确定的了的是吧,这种呢,其实算它的一个特点,不算是一个弊端。甚至说呢,这块还得算成他的一个优点。诶说这怎么讲呢,呃,因为呢,我们明确的是int类型,你就不能够放别的类型,使得我们这个数据啊就更安全。所以这是个优点。啊,如果你说你看这这算优点,那我怎么觉得是个弊端呢?如果你想放别的类型,你大不了那就声明object类型呗。有债类型的这块以多肽的方式呢,这不也能放多种具体的一个对象嘛,啊,也可以体现了你比较灵活是吧?哎,所以这儿呢,其实算是我们的一个,哎,注意这是一个优点啊。诶,这个优点啊,这个怎么描述呢,就是数组啊,一旦呢,我们就要啊初始化完成是吧。
10:02
啊,初始化完成,其元素的类型就是确定的。啊,然后呢,不是此类型的。啊,这种这个值是吧,或者叫这个元素。就不能够。啊,添加到此数组中。数组中,哎就是这样的一个特征,哎,像咱们刚才提到了啊,因特一和数组这呢,我们逆完以后呢,比如说这个长度是十了,然后这个AR啊,角标零的位置,我们给它附个一,这都没问题,这个呃,角标一的位置呢,你说我这块呢,整一个A啊注意这个呢就不行,要边译呢就报错了。是吧,哎,那如果说呢,我们想让它体现一下这种更灵活的特点,那你大不了呢,刚才我们提到了有生命object类型的。哎,这块我们去扭object性的这个数组,哎这么着,然后呢,A2角标一的位置啊,哎角标零的位置,这个呢,你大不了这块呢,你可以放一个字串。
11:00
啊,然后呢,这个我们脚标一的位置啊,你可以再去扭一个data啊这块呢,体验呢,其实也算是比较灵活一点,所以呢,就是要灵活有灵活啊要这个啊严格呢有严格。啊,没问题啊,那由这个出发的话,其实我们这块还可以再写一个特点,当然这个呢,大家可能说这个不太容易想到了啊,它是相较我们说的这个集合来讲的啊,这呢也是它的一个优点,就是我们这个集合中元素的类型啊,你会发现呢,它既可以是基本数据类型,也可以是饮用数据类型啊,这是它的一个优点啊。呃,元素的。啊,类型既可以是。基本数据类型。啊,也可以是。啊,引用数据类型。啊,这是它啊,那为什么这块我明确写的是优点呢,因为我们的集合呀,在这方面呢,其实体现出来了,就是它对应的缺点了。这个集合呢,我们在放啊里边它不是也是容器嘛,它在放这个元素的时候呢,它只能够放数据类型的。
12:02
他不能放基本数也行。那你说我们要是有基本数据性这个需求呢?对,那你就用包装类了,包装类的对象呢,往里边去放,所以呢,它只能放这种对象特征的啊,这是其一,其二的话呢,就是我们这个对于集合来讲呢,它其实呢,没有什么要求,你就随便往里边放了,所以它不会对这个类型呢做这个检查了。这样的话呢,其实就使得我们这个容器里边放的东西啊,就比较杂是吧。啊,就不安全。那咱们就不安全了啊,那怎么办呢?咱们下一章要讲一个新特性嘛,叫泛型是吧,这个泛型呢,就是专门来限制往饥饿中放元素的这个类型的,比如说这个泛型上我就写了个string。那这个时候呢,才能达到跟我们数组一样的特征数组呢,说明是果是string的,那你不是string就放不进去了,我们集合里边如果用上这个泛型就叫string的话呢,它也只能放string,其他的类型放不进来。啊,通过泛型呢,才能够达到跟我们数组一样的这种特征。
13:00
那关于特点呢,其实基本上就这样了,然后弊端这块呢,就是我们还可以呢,再稍微的提一下,你比如说我们这个数组呢,提到了它的方法比较少了,那其中呢,有一类操作呢,就是我们需要呢,去添删改查这样的一些特征是吧,那这个数度呢,由于呢,它在内存当中,我们说呢,它是依次紧密排列的这样的一种特点呢,就决定了咱们前面做相关的项目也做过这样的问题了,如果呢,我们是想做这种删除操作。啊,这里边儿有好多的这个数据啊,我想把其中的某个元素给删掉了,或者呢,我想在某个位置呢,插入一条数据,像这样的操作的话呢,我们这个性能呢,是不是都不太好。啊,那当然呢,我们说呢,如果你想找指定位置的元素,或者我们在尾部呢,去给它再添加个元素,这样的性能都可以。我们如果从复杂度上来讲的话呢,在尾部呢,添加一个元素,或者你想找指定某一个缩印位置的元素,它的复杂度是。O1的是吧。对,就是常量级别的,你比如说你找某个位置的,直接一步到位就找到了,你想在尾部插一下啊,直接就找到这个位置了,所以呢,它是O1,就是常量级别的这个复杂度,但如果说呢,我们想在指定的位置呢,插入一个元素,或者我想删除指定位置的元素,它的复杂度是不是就on了。
14:14
所以呢,它对于这种插入或者是删除操作呢,就不太友好,性能呢就比较差一些是吧。哎,这我们说一下啊,说针对于啊数组中元素的叫删除和插入操作啊,性能较差。啊,这是它的一个特点,那对应的优点呢,就是它的尾部的添加,包括呢,查找指定缩因位置元素,它的性能是较好的。那这个较差的这种特点呢,主要原因就是因为它是在那种依次紧密排列的,那我们这一章呢,讲集合的时候呢,除了这种方式之外呢,还会存在这种链表的方式,这种链表的方式呢,它其实对于这种操作的话呢,性能就比较好,复杂度呢,就可以达到O1这样的一个情况。好,那这样的话呢,咱们就捋了捋这个数组呢,相关的一些特点和这个弊端啊,原来呢,我们在使用数字的时候呢,觉得也都挺好用的,没觉得有什么弊端啊,那现在呢,因为我们要讲集合了嘛,所以我们这块呢,就谈谈它有什么弊端了啊。
15:12
好,这个事儿呢,我们就说到这儿了,然后由此呢,我们引发出来,咱们要讲相关的这个集合了,集合这块呢,因为涉及到这个API呢,也比较多,整个来看的话,就相当于是一个框架体系一样了,哎,那整体来看的话呢,都有哪些呢?注意这一章呢,我们这个体系呢,是从这个接口的角度出发的。像以前比如我们讲的异常体系,咱们都是通过这个类的角度出发啊,下边error exception,下边具体的这个词类,这都是类的体系,咱们这块呢,讲的话呢,是从这个接口的体系下啊出来的啊呃,那么比较顶级的接口呢,注意有两个。在U下呢,这块第一个呢,叫做collection接口。然后呢,跟他并列的还有一个呢。叫做map接口。这两个的特点是什么呢?很好区分,Collection呢,它是用于存储,要一个一个的数据。
16:04
啊,一个一个的数据,而这个map呢,它是用来存储叫一对一对的数据。哎,从那个角度出发呢,有点就像我们生活当中可能是单身狗是吧。都是一个一个的是吧,啊你也可能呢,是这个情侣哈,一对一对的是吧。哎,就这样的两个特征的数据了,好,那这个collection呢,注意这都是接口啊,Map呢也是接口,然后呢,这个collection下边呢,说你是不是该有一些实现类了呢,没有它呢,还有子接口,我就不写Java点优秀这个包的这个声明了啊,直接呢就写它的这个子类啊子接口了。这个子接口呢,其中一个呢,叫做list接口。呃,然后呢,还有一个子接口。哎,这个子接口呢,我们讲一下这个叫set接口,其实它还有其他的子接口,咱们主要呢,就是讲这样两个,就是开发中我们比较常用的啊好,那么这两个子接口呢,特点呢不一样了。
17:02
那否则的话就没必要讲这俩了,是吧,这个例子呢,它的特点呢,它存储的也是一个一个的数据,毫无疑问了,然后这一个个数据的特点呢,就是它是叫有序的可以重复的数据。可重复的这个数据啊,那么对应的我们这个set呢,跟它正好相反,它呢就是存储叫无序的。哎,无序的叫不可重复的数据。好,这个你看明显的都是不一样的了。哎,这个呢叫存储有序的可重复的数据,它呢下面就有具体的这种实现类了,这个实现类呢,我们要讲的话呢,诶第一个叫做aist。哎,然后呢,我们还要讲的叫link at least,还提到一个叫做vector。哎,这呢是有三个这个具体的实现类了,好,那么这个set接口这块呢,我们讲它的具体的实现类。那这个时间内呢,我们提到了叫哈希。
18:00
哎。哎,还有呢,叫link的。哎,哈西set是吧,还有一个呢,叫tree set。啊,这样的三个具体的实现类,OK啊,那么为什么要讲这三个有什么区别,这个咱们一会儿再说啊好,这呢,就是我们整个这个collection这个的体系下边这样的一些结构了,然后呢,对应的另外一个跟collection并列的一个接口叫map map呢没有此接口直接呢提供的这个具体的实现类了,这个实现类呢叫。哈,Map。Link的。哈,Map。哎,然后呢,还有这个叫tree map,诶这样一洗的话,你发现诶。好像在把上面这个呢,Set改成map,就是下边这仨是吧,似乎呢,有点这样对应的关系啊,你如果这样想的话呢,就对了。就对了啊,这个哈希赛啊,其实它底层就是哈希map,这个底层就是它,这个底层就是它。
19:00
你说诶,他俩不是这个叫一个一个的数据,这怎么是一对的数据,那怎么就成了底层是他了呢。哎,就这个呢,你可以说,哎,我也不是单身啊,我指向了一个我的对象,你对象呢,是一个闹是吧,比如说。啊,你说我不单身啊,我有一个虚拟的一个女朋友是吧啊。啊,也可以忍受吧,是吧,当然呢,实际情况的话呢,这个我们set里边呢,它不是放一个数据嘛,你想如果这个map呢,它是一个数据呢,指向一个数据,这不就一对一对的是吧?哎,你这块呢,如果把指向的这个呢,如果咱们看成是no,那这时候呢,实际上我们就只关心他了。哎,其实可以理解成了就是对应的这个set了,但实际情况呢,它指的不是个no啊。指的是个啥呀?它底层呢,如果我们看源码了,其实它就new了一个object。就是大家都指向这个object,哎,好几个元素都指object,就指这一个,诶怎么指object不止闹呢,只闹,万一你要是拿着这闹去调方法,不还得控制针吗?我给你整个对象呢,这块是不是就不空了呀。
20:01
那就这样。啊,你也可以理成呢,就是所有的这些单身狗呢,大家都只像一个国民女神是吧?哎,都只那一个,这就相当于你也是成对成对了啊。哎,简单理解一下啊。好,那这个咱们讲到后边的时候呢,会说这个事儿了,就是现在来看的话,你发现他们之间有点这种关系啊,那这个麦这块呢,我们还得还有别的啊,还有呢叫哈希。啊叫table,注意我这个T呢没写错。这个T就是小写的。嗯,这个反而呢很多在笔试面试当中,这个题呢,他还给你写成大写了。你可以到时候给他改成小写的,侮辱他一下是吧?啊,正常就是小写啊,然后呢哈呢,它有个子类叫做properties啊。OK,那么关于map这块呢,实现类我们就说这几个啊,显然呢还是比较多的,这个呢,就是整个我们讲的这样的一个集合的体系框架了。好,那么翻回来呢,稍微的再多说两句啊,比如说呢,我们提到了这有个例子啊,叫存储有序的可以重复的数据,这个我们怎么去理解呢。
21:03
啊,你会发现呢,我们这个例子呢,似乎呢,它跟咱们前面提到的一个数组。是不是类似的存储特点是一样的是吧?啊,那其实这块呢,我们就把这个类呢,就看作呢,叫做动态数组了。哎,怎么叫动态数组?我们刚才提到数度有个弊端,叫一旦初始化,其长度就不可变了,长度是十,最多十个,第11个不好意思加不了了,而对于我们这个例子来讲呢,你不用管。啊,这个呢,你只管往里放就行,你不用考虑说是不是脚背接了,会不会超了呀,诶我呢会动态的帮你去扩展底层这个长度。所以呢就非常的方便啊,所以呢,我们就加了个引号叫动态数组。啊,这样的一个场景。好,那可以理解成呢,就是咱们这个例子呢,其实呢,就可以去替换以前我们的数组这个结构了。那具体用的话呢,肯定是具体的些实现类了啊,主要替换呢,其实是我们的release,也就是list呢,作为我们这个list的一个,你可以呢,作为一个默认的实现类,或者叫做主要的实现类了。
22:07
啊,也就是说呢,如果你要是用list的话呢,呃,基本上你不用过多的思考,你就直接去一个a list就没啥大问题。然后这个的话呢,叫无序的不可重复的数据。啊,无序的,不可重复的,这个以前我们有没有接触过这样的场景呢?无趣的,不可重复的。是吧,在这个生活当中其实有这种场景啊。啊,你比如说这个咱们说的这种黑名单是吧。包括大家呢,这个手机当中,你可能有一些电话呢,老是骚扰你,你也把它加到黑名单里了,这个黑名单的话呢,其实它就是一个set了,就是你一旦加进来以后呢,你就没必要再去加一份了。那这个呢,就是不可重复了啊,然后呢,谁先加的谁后加的无所谓,都在黑名单里呢是吧?诶这个呢,其实就是一个set的一个场景。诶,你也可以想象呢,比如说你去超市里边去购物,推这个购物车是吧,这是这个车了,里边你放点这个,放点这个,放点这个放点这个,这个呢,其实也一种无序的状态,诶相同的东西呢,你都用一个袋儿给它套起来了,彼此之间呢,你可以理解成也是不相同的是吧。
23:10
诶这个呢,就是这种set啊,所以呢,从我们学习的角度来讲的话呢,以前有没有这样的概念呢,这块呢,我说啊,其实跟大家高中学习的。哎,那个集合呢,是一样的。高中学习过这个集合吧。对学过啊对,就是有一个这个圈是吧,这圈儿里边能放一些具体的一些数据了,比如我放123。四是吧,我放这四个数,这呢就是一个集合了。对,你说我们这个集合里边,如果我这块有一个是1324哈,这俩一样吗。一样是吧,一样,但是呢,高中讲那个集合的话呢,提到有三个特征啊。啊,一个呢叫确定性。确定性,确定性呢,什么意思啊,就是你这个元素呢,在不在这个集合里边是确定的。
24:01
你不能说可能在,可能不在这不行啊,哎,这个呢叫确定性,还有呢叫无序性。哎,这个哎无序哈。这个无序性呢,就像我刚才说的这两个呢,咱们是认为是一样的,就是你先写谁后写谁无所谓了。啊,再一个呢,互异性。就是彼此之间呢,不能一样。是吧,哎,你看这三个特性的话呢,跟我们这里边讲的其实就是对应的吗?无序性这不是也叫无序性,不可重复性不就是互一性吗?确定性在不在我们这个size里边,其实我们也是知道的。那其实就跟咱们高中讲的这个集合呢,你看是一样的是吧。大家都忘了啊。那我还记得呢。这是因为呢,我我本科毕业之后呢,其实我当过这个高中老师是吧。嗯,高中数学老师啊。对,我这不是本科数学系的嘛,是吧。在这个,嗯,石家庄二中是吧。
25:00
嗯,知道是吧,知道的就知道了哈,对,我是有编制的那种啊,对不是那去那代课了哈,但只不过呢,是因为我,呃,第一年的话呢,他第二年才会下这种编制,我第一年的时候我就给辞职了。对,高中数学老师还当班主任啊,按说呢,前景还可以是吧?但是呢,年轻嘛。谁没有犯过一些错误呢,是吧?年轻时候想法总是很高远啊,其实呢,我特别不想当老师,我也不太喜欢当老师,结果呢,现在还是老师是吧啊。诶再一个呢,就是其实怎么着呢,年轻的时候呢,你发现如果你要是在自己的诶比较年轻的这个阶段,遇到一些贵人能够给你指点指点的话呢,其实是一件很幸福的事儿是吧,对于我来讲呢,就没有,所以你发现这个路呢,都得自己趟,趟的时候你发现一些就会走一些弯路啊等等是吧。啊,我能过去呢,主要原因是一方面,你要说这个本科成绩多好呢,倒不至于,可能还是因为在学生会呢,任职的情况是吧,有一些优势啊。
26:04
嗯,就是当时就做到学生会做到头了是吧。对,就是学生会主席嘛,是吧,所以呢,就去这个学校就比较方便一些是吧?嗯,这个在中学里边可能还比较看重这个东西啊,加上学校的话呢,东北师大这块主要就是培养老师的是吧,所以呢进去比较容易。啊,其实呢,后来想想呢,应该当时在读个研的。其实当时呢,我也考研了,也能够这个在本校里边去读。其实也没好好准备啊,其实可以争取呢,研究生毕业以后呢去。东北师大附中是吧?这就更牛了是吧?对,这个就更牛啊。嗯,对,然后呢,当然本科能去这儿呢,也已经很好了,那就过去,过去之后呢,发现不行,我得追求是吧,我得我得有理想是吧。咔,就给辞了是吧,现在来看的话呢,现在30多了,快40了,发现其实待在那也挺好是吧,OK啊,所以人生呢就会有很多的选择,年轻的话呢,还是要拼一把是吧。
27:00
后来我就裸辞了,然后我就考研去了是吧,好拉回来啊,这个呢,就跟咱们高中讲的这个集合呢,其实是一个意思啊,诶这里边儿有三个具体的实现类了。那么我们还有一个呢,接口叫做map,它呢是用来存储叫一对一对的数据,这个一对一对数据呢,其实我们就相当于呢,可以看作是诶,它有这样的一个特征,就是有一个呢,我们这里边儿叫K了哈。一个K呢,对应一个value。哎,我们这呢叫键值,对,这叫键这叫值嘛,哎,所以呢,它存储呢,叫做KY6键值对特点的这个数据。OK啊,那么他跟我们以前讲过的什么概念类似呢?啊,这时候你想啊,我们现在有一个X,我就让它对应一个Y。或者叫一个X1对一个Y1是吧,然后呢,你还可以呢,对一个X2呢。对应一个Y2是吧。那么这时候呢,其实你发现这个点对点对呢,如果你在这个数轴当中给它表现出来,它可能就是一条曲线。
28:04
这个曲线呢,就有可能用一个函数呢去刻画,所以这块呢,我们说呢,其实就对应着我们一个,诶以前高中讲的这个函数了。啊,就这样一个特征,所以呢,它呢,就类似于啊,咱们高中讲的函数啊。啊,类似于啊高中的这个函数,或者你说叫映射也行是吧,函数呢,属于一种特殊的映射,因为它可以用一种相关的这种式子表达出来嘛。OK啊呃,为什么说跟这个函数一样呢,我们这个map当中,它后边呢,还会有一些针对于KY6的一些要求,比如说。呃,不同的key。指向同一个。一个K呢,不能指向多个Y流。像这种特点的话呢,在我们函数里边呢,也是有的。你比如说咱们针对于像Y等于X方这样的是吧?哎,你这个一指向的是一,负一呢,指向的也是一。
29:01
就是你可以不同的这个自变量指向的是相同的因变量。我们在ma这块也一样。你不同的key。可以指向相同的Y6啊,张三考了50分啊,李四呢,你说你不能考50分啊,因为张三已经考过了,这有点过分了是吧?诶,所以呢,你也可以考50分,所以呢,就这个Y6呢,是可以相同的。但是你不能什么呢?在我们函数里边,你不能说这个一,它的这个自变量,因变量的结果呢,是五啊,也可能是六,这不行。啊,那在我们这个KY这块也是同样的道理,你一个K呢,你不能指向多个Y流。啊,你不能这种,咱就这一箭双雕是吧。啊,你可以呢,是多个键呢,指向同一个值是吧。啊,多个键呢,是射中同一个标啊,不能这种一个自变量指向多个值,哎,跟我们函数这块呢,是完全一样的。哎,刚才我们说了一个函数,主要目的呢,是我们强调一下map当中key value的一个特点。啊,这样角度来看的话呢,我们其实这些结构呢,似乎呢,都不是特别陌生了。
30:03
哎,大家都有之前的一个底子啊,一个认知了,那我们主要做的事儿是什么呢?就来看一看具体的这些实现类,你看都有谁,然后呢,我们该怎么去造对象啊,然后呢,呃,怎么去用它常用的方法完成咱们整个这个项目的一个需求,所以这一章里边呢,我们根据大家学习的一个要求呢,提出这样几个层次哈,首先呢,是。哎,这个叫,诶层次一是吧,层次一是什么呢?针对我们这里边这个相关的这个接口,它有一些具体的实现类。那么在具体的问题当中啊,咱们得知道呢,用哪一个接口的实现类。啊,然后呢,这个时间类的话呢,我们知道呢,去造对象,然后使用它常用的一些方法。啊,对于这个set结构来讲呢,它的主要实现类呢,就是这个叫哈希set,然后map呢,主要实现类就叫哈希map。哎,所以这块这个层次一呢,就是针对于具体特点的啊,多个数据啊,哎,这个知道选择。
31:04
啊,知道选择啊,相应的适合的接口的主要实现类。啊,然后呢,这个呃,会实例化。啊,然后呢,会调用常用的方法。啊,你比如说现在呢,我们针对这个特点呢,就是相当于原来像数组一样的特点啊,是有序的,是可以重复的,然后这时候你就都知道呢,会用list,哎得用list,然后主要实验类呢,这块其实就是a list,也就你知道呢,得回去new a list这个实例,然后会用它里边长话就行了。如果是这样特征的数据呢,你知道回去new阿西赛,然后回调常的方法就行,这个呢,实际上是我们开发当中最主要的一种场景啊,使用频率呢是极高的,然后这个层三二呢。啊,那么这时候呢,针对于我们这个接口来讲呢,它有好多个实现类,所以第二个层次呢,就是大家能够去区分啊,接口的不同的实现类之间的区别。
32:02
啊,区分接口当中不同的。啊,实现类的一个区别。啊,那也就是说呢,我们在比如map当中,咱们用它呢,没问题,那什么时候会用它呢,什么时候会用它呢,是吧,那既然呢,启用了这些时间内肯定呢,有他们相关的一些使用场景了,我们得能够会去做一个区分,诶在这里边呢,也会涉及到一些。面试题啊,他可能会问你是吧?哈map和哈table有什么区别呢?是吧?Map跟link map有什么区别呢?A release跟link list和vector,它们三者之间有什么区别呢?像我刚才说的这样也都是常见的啊,高频的鄙视面试期。啊,所以呢,我们得能够去区分啊,那么这呢,就是相当于我们这个层次二了,咱们在讲这一章的时候呢,这两个层次呢都会讲到,然后这个层次三的话呢,要求就会更高一些。啊,这个从三呢,就涉及到了我们这里边看到的啊link的意思a vector这个呢,都是具体的一些类了。
33:01
他为什么表现出来的啊,是这种有趣的可以重复的是吧,然后呢,他俩之间呢,为诶他俩之间呢,为什么表现出来你呢啊去添加呀,去查找啊就快,你呢,删除呢或者插入呢,你就快。啊,其实这就涉及到了不同的这个实现类底层的数据结构不同了。所以呢,我们第三个层次呢,有两个点啊,第一个点哎,针对于常用的啊实现类。啊,需要呢,去熟悉底层的源码。哎,我们要翻一翻这个源码,然后第二层次呢,针对于我们看这个源码过程当中看到的一些数结构啊,需要大家去熟悉常见的一些数结构。啊,那为什么大家上这个大学的时候呢,亲爱的,你学这个数据结构呢,你总觉得差点意思是吧,好像很少说呢,听谁讲说自己数据结构学的特别好的,其实其中一个原因呢,就是因为在讲数据结构的时候呢,就比较干是吧。单独的讲完数据结构之后,你也不知道说到底怎么应用啊,更好的去体现它还是偏理论,那我们讲这个数据结构内容呢,咱们就结合着集合来去看,然后呢,在不同的场景下呢,我们选择不同的时间类,你发现呢,性能呢确实有区别。
34:12
啊,这样的方式呢,去学习数据结构呢,就更务实一些啊好这呢,就咱们这一章的这个特点,针对这个层次三呢,咱们其实呢,是在这个第14章当中讲啊。那么前两个层次呢,咱们是在第12章中讲的这两个层次,这是递进关系,这仨体都是递进关系,所以呢,哎,对于所有同学来讲呢,你先别去研究三呢,这个一呢,你得先会。啊,代码里边你得会去造对象,会去调方法啊,这是最务实的了,其次的话你再看一看,说除了这个主要的时间类,还有其他的这个时间类呢,是什么特点呢?啊,再去扩展一下,然后第三个你再看一下底层的源码的事儿。啊,学习的这个递进的程度是吧,得是这样子的才行啊好,那么一会儿过来呢,咱们就开始来讲这个collection,然后呢,再讲map这一章呢,其实主要呢,就是说这些具体的API的使用,OK啊休息一会儿。
我来说两句