00:00
好,首先呢,呃,说一下这个作业的事儿,呃,上次课呢,给大家布置了关于集合的一些问题,对吧,集合的一些问题啊,那么这个集合这这些题里边呢,呃,有一些啊,同学们现在可能还是不能做对吧,那这样子。呃,怎么样怎么样呢,我这个题呢,先暂时不去评讲,但是呢,我先把答案先给同学们公布一下,就是这个答案呢,呃,一会儿我发给同学们,或者说今天我先发给同学们,同学们看到我在这个答案里边呢,已经写上了自己的一个解题的思路,你比如说第一个题我是怎么分析的,然后下面呢,有这个具体的代码。啊,你把把第一题你看我有分析,那第二个题呢,我也有分析,那同学们呢,先尝试着按照老师的这个分析的思路和结合这个源代码去先看看能不能看懂,对呃,因为有一部分呢,跟我们集合操作是相关的,你比如像这个reduce对吧,像这个化简折叠。
01:12
啊,这些呢,因为同学们还没有去学,所以说一时半会能看不懂也是有可能的啊,有也是可能,但是呢,最终今天完了过后,同学们都应该能看懂了,这个是应该做到这一点的,所以说这个作业呢,我先发给同学们啊,答案先发给同学们,然后呢,同同学们在中午的时候先看一看,如果实在是有看不懂的怎么办呢?那你就来问我一下啊,因为将来你们参加工作以后,除了要去啊,除了要去自己写功能模块之外呢,还有一个最重要的这个能力,就是能够看懂别人的代码,所以说曾经有些同学工作以后,哎,回来跟我反映。说说老师那个,我恨不得自己重新写一遍,为什么呢?别人的代码实在是看不懂,但是看懂别人代码和调试代码本身就是一个能力,所以说呢,去看一看也没什么坏处,因为这些作业都比较简单,都是一些基础性的作业啊,所以说同学们呢,按照老师把答案公布出来以后,自己去看应该是没有什么问题的啊,这个作业呢,我就先说到这里,好,那现在呢,我们还是老规矩,把上一次课讲的这个内容呢,做一个简短的回顾。
02:30
那上一次课我们讲的内容,看一下这个视频,我们是从集合的基本介绍到集合的啊,所有的操作啊,就是我们集合操作呢,都OK了,好,现在呢,我们来看一下这个,呃,上次课讲解的内容。好,我们先看一看,我们是从哪开始讲的呢?哎,我们是从这一大块,就是数据结构,从这一系列的全部给他说完了啊这样子我为什么把这个标题都列在第211个目录的,就是希望这样子大家看的比较简单,所以说我是尽可能的把把这个笔记呢,都是列在第二集,就最多不超过三层。
03:15
因为有些呃,有些同学学同学呢,喜欢把这个第一点下面有三点,三点下面每一点又有三点,三点下面还有三点,最后自己也不知道是第几点了啊,所以说干脆所以说我们在学东西,最好这个思路也是控制在三层就行了,那最好扁平化,你看这样子,大家一看哦,汤讲的这个历史,讲这个Q啊讲这个map讲的这些set讲的这些也比较清晰,好那么我们来做一个简短回顾啊啊简短回顾首先呢,先给同学们说了一下,呃,关于这个数据结构的一个概念。啊,集合呢,其实准确的讲不是数据结构,它是由数据结构实现了集合的功能,应该这么去理解更合理一些。
04:00
对吧,这样这样去,就那有些同学说数据结构到底是什么,他到底有什么作用,诶我记得我上大学的时候,我们老师他就诶给我们打了一个比打,打了一个比喻,比喻我觉得还是比较有呃道理的啊,他当时给我们讲课呢,他说数据结构怎么理解呢?就好比一个足球运动员。这个足球运动员呢,呃,要去得分,最终呢,是要射门的,对吧,就是因为你只有射门,这个球进到对方的球门里边,你才能拿到一分,那么这个数据结构就好比这个足球运动员的什么能力呢?就是他的带球的能力。啊,如果说他射门再厉害,他把球带不到对方的禁区,那他就肯定把这个球射不进去,那就好比他的一个基本功一样。哎,我觉得这个比较呢,还是非常到位的啊,所以说当时我们在学数据结构呢,学了一点,呃,很懵的样子,但是后面还是发现特别的有用,这是真正的一种,就是就思路和算法在里边啊,同学们呢,后边也可以在这方面加强一下,这是如果你听老师的呢,你就去加强,你要不听你觉得那无所谓,对吧,我就愿意当一个code对吧,别人让我干嘛,我就把它写出来就行了,我也不去讲结构,你看啊,当我们要去解决一个具体的问题的时候,我们要数据结构,当我们写一个程序的时候呢,这个程序模块呢,我们有程序结构,当我们程序功能模块特别多,特别大的时候呢,还有一种结构,这个就是上就上升到体系的这个架构层面了,所以它程序有程序结构,当程序之间功能模块要相互合作,要要这个呃负载均衡的时候呢,我们就称之为架构,其实所所有东西都在我们这一些地方,别人都给我们设计了很多的规范。
05:44
啊,同学们以后呢,在写大项目的时候,都会有相应的规范来告诉你应该怎么做,呃,因为软件行业现在也发展了,有从这个,呃,从美国那边他应该是这个是从上个上个世纪,比如说七八十年代就开始有软件工程的概念,到现在呢,也有50多年了,所以说有很多成型的这些理论,还有我们成型的一些实际的一些技术都能解决,后面你们要学,呃,不知道后面你们有没有开像这种课程,像UML啊,像UML呢,叫统一建模语言,这个统一建模语言可能有些同学听过叫统一。
06:22
建模啊,建模语言。他他可以做到什么呢?就是像印度啊,印度印度阿三有时候我们觉得他挺挺那什么的啊,反正我们觉得这个这个这个民族是很奇葩的一个民族,但是印度阿三有一点必须得承认,就是在世界上啊,就是软件出口国家,印度阿三能够排在第二的,为什么呢?他们写的东西已经可以达到这样一个标准,就是用统一建模语言生成的这个。这个模型用一个逆向工程,能够几乎把这个代码80%的代码就给你生成了,另外的20%呢,就让程序员去写,所以说印度阿三他们写的软件几乎能达到什么水平呢?就100个人写的代码,就好像一个人写的一样。
07:08
啊,当然中国就反过来了,一个人写的好像100个人写的一样,对吧,这个也很郁闷,因为像像,呃,像日本德国啊,这些国家的软件都非常的发达,他们他们几乎是在世界一个软件出口国,软件出口这块占了他们国家一个很重要的比重,因为印度那边的成本也很低啊,以前我我现在还有一个学生姓朱,姓朱啊是是在零七年代的一个学生,后面我在朋友圈看这这哥们发了一个在印度的照片,我说你干嘛,他说我现在在印度已经待了四年了,我说在印度你跑印度干嘛去?他说印度那边,呃,这个他比较喜欢印度的,那么这个佛教人玩玩意是吧,我说印度那个工资怎么样,他说印度工资其实挺低的啊,那那边印度的他整个这个人人工成本比较低啊,比我们这边的程序员的工资整体水平要低一些。
08:00
但是那边的那些人呢,他他也比较满足,满足了,因为整体的消费能力就比较差嘛,所以他他能拿到,比如像现在中国能挣1万块钱人民币的,呃,合合到那个印度那边它是非常高的公司了,印度人多呀,对吧,印度人多啊,那人人力成本就比较低啊,好所以随便说了一下,这个就数据结构,我们将来呢,后面这个学东西,后面就是你们往架构师这个方面走呢,一定要去加强一下啊好,然后呢,我们再讲斯看的数据结构的时候,我先啊说一下集合这块分成两大类,这个是必须知道的,这个是大体。第二个呢,别人问你的时候,你的脑海里面一定要闪现出这么一个概念,就是我们是开了集合呢,有三大类,一个是sequence,一个是S,一个是映射,那昨天我在想一个问题啊,我们学完这个集合过后呢,其实掌握这个集合的基本使用都没问题,最难的问题是在什么呢?地方呢?最难的地方就是这个问题很难回答,就是。
09:00
什么问题呢?说什么时候应该使用什么集合这个问题。就什么时候应该使用什么集合这个问题,其实是特别不好回答的。那为什么呢?呃,就好比我们学了很多的武术招式,对吧?在你没有实践之前,你行走江湖,你可能连一个地痞流氓你都打不过对吧?你学了,比如你学了独独孤九剑,你不会用的,被人家打的头破血流。对吧,你不知道你该什么,该出哪招了,那么这个问题呢,我可以简单的根据我的经验来说,就说我们再去,呃,决定使用什么集合,或者使用什么技术的时候,你首先要搞清楚他们的区别,你才能知道怎么用,明白我的意思吧,啊,那么你比如说在这里我们看到集合,你的脑海里面要出现出它有序列的这种集合,有这种set这种集合,有map这种集合。那么首先呢,我们来看这两者和map的区别,Map最大的一个特点,它的数据是KY6的形式,是不是这个意思啊,所以说呢,如果你在使用的时候,你的这个底层的一系列数据,它有这种K,它有一个K。
10:18
来标识。啊,它用个K来标示一个值,呃值的这个时候呢,你就应该选map。啊,最经典的就是哈希map的一个实际应用嘛,就是我们放,比如说将来我们想用一个学生的ID去标识各个学生。或者说我们用一个人的身份证去标识一个学生,那这个时候呢,你就可以用这个k value形式来进行管理,那么呃,如果是这个序列呢,呃和集呢,你要知道序列sequence它最大的一个特点有两点,第一个呢,它是有序的啊,它是有序的。第二个呢,它还有一种就是我们叫做这个线性的就。
11:03
这这种集合,这种这种序列,这种序列呢,往往跟我们的实际应用场景有密切的关系,你比如说这个能力里面呢,它的序列有我们经常用的像占sta有Q这种队列,那么它的应用场景就很明确了。你比如说我们将来要做一个排队系统,叫号系统,诶这个时候你就想到它是有序的,因为一叫号就涉及到顺序嘛。你再比如说你要做一个简单的一个计算器的一个占,你要做一个计算器,比如说你要去做一个二加三除以四,再加上一个小括号,减去一减二用小括号,这种你要做这种形式的话呢,它一定也是跟占相关的,所以这个时候你就应该选择应用性比较强的,像这种有头有尾的能力的序列,就是应用场景来决定你的使用,那有序吗?好,那如果说我们就是存放一堆数据,而这个数据呢,我们要求它是不重复的。
12:06
啊,也不需要它有序,这个时候呢,咱们可以用S,准确的讲晒的应用场景相对来说要少一些,为什么我在后面只讲了那么一点,对吧,你想想你在那个Java里边,你学你们学Java里面这个set相对用的就比较少啊,相对用的比较,但是不是说没有对吧,不是说没有好,所以说我说一个技术的使用呢,你首先得把区别搞明白,就是为什么老师在讲课的时候一定要把它的特点拎出来,就好比我们参加工作以后,到底你将来是用这个map reduce来进行大数据的计算,还是用Spark,还是用storm。那你都要分析这个业务逻辑了,这就是架构师要干的事儿,好聊了这些过后呢,我们紧接着举了很多案例啊,就是说我们明首先要明白何为可变,何为不可变的基本概念,对吧?那么这我又已经标出了一个红色的一个字啊,何为可变,何为不可变,我也说了一下这个概念,那有些东西呢,还要自己大家去领悟对不对。
13:07
好,呃,然后紧接着呢,我抛出了一个特别重要的这个图,这个图其实我本身昨天我想一下,想让你们今天早上上来,每个同学就是拿出纸和笔把它默写下来。其实我是想做这个事儿,后面我因为昨天呃,布置作业的时候没有说就就就这个这个事情呢,可能是我可能是明天或者是哪天,呃,我是要求大家把纸和笔拿出来给我默写出来,每个人把这个作业提上提上来,这个图是一定要把它背下来的啊。你如果说脑海里面没有这张图,我们这个集合你是没有一个根本的概念,所以这个图呢,一定要背啊,背下来啊,背下来过后,你在用的时候呢,你的脑海里面就常的清晰和明确了,好这样大家做一个作业吧,你可能要小心,可能明天早上我会拿十分钟让你们把这个图自己画出来,也可能是下下次课啊,总之呢,我可能是要我是要进行一个考察的,好这个呢,我就没办法再一个个的念了啊,就是这下面的总结也是非常多的,就不一个个说了,不一个说了,好紧接着呢还说了一下可变集合的层级关系,可变集合在我们应用中呢,也是非常多的,因为一般来讲,我们在进行这个集合呢,不可能说不去改,动态的改变这个结合,比如我们要对集合里面数据进行动态的增长,或者说要去删除这个集合里面的一个元素,你不可能不这样操作,所以说呢,这个可变集合的应用场景相对来说用的更多。
14:36
啊,相对来说用的更多,因为你要变嘛,你要变你就没有办法不去好这个图形呢,我就放到这了啊,大家一定要去看,一定要去看好的,呃,这个地方有有这个东西我要拎出来一下啊,这个buffer将来大家用的也比较多,因为buffer呢,呃,经常是用来变的啊,像这个buffer和历史的buffer啊,这个用的是比较多的,好同学们。
15:00
啊,这个每个图我也做了说明,那这个讲完了以后呢,我讲了一个定长数组,变长数组就不再多说了啊定长数组就是一个数组呢,跟Java几乎一样,就是不能变化,那么变成数组呢,首先名称是a buffer,只要看到在SC里面,你只要看到什么叉叉叉这种buffer的东西,一般来讲都是可变的啊啊只要看到这个buffer缓冲的这个一般都是都是可变的。好,然后呢,我讲了temple啊,这个temple呢,哎,我们回忆一下他是干什么的,诶,我们来一起回忆一下temple是干什么的。好,我找一个同学说一下啊,这个汤这个集,这个集他是做什么事的,我随机的抽查一位同学,看看他还有没有一点印象哈,找一位同学叫做什么呢?咱们找一个就近原则吧,叫。这个王双喜同学来回答一下。双喜,你还记得这个汤是什么吗?它是干什么的元组,呃,然后呢,它有什么特点吗?
16:03
啊,一到22,就是最多有22个元素是吧。然后还有什么特点吗?他访问的时候有什么特点吗?访问元组里面的元素有什么特点吗?它是怎么访问的?哦,那就好,请坐下吧,已已已经记记混了啊,已经记混了,他说通过map.get k他已经已经记混,Top不是这样子的啊,Temp呢,就是它是有一个特点,就是它的元素中最多有22个元素,那么一到22就是说每一个是这样子的啊,就是说你不同个数的元素对应的这个类型就不一样了,就top呢,它是你有一个元素,它就对应temp top1这种类型,如果你有两个就TEMP2,有三个就3TEMP3,而且每个都是不一样的,它取值的时候呢,它是用你的这个点下划线,一这种方式,二这种方式,三种方式来取对应的元素的。
17:03
那么to呢?在我们实际应用中,它的效率较高。这个top是我们开了特有的一种数据类型,它的使用效率较高,因此呢,斯SC他的这个设计者是推荐尽量使用这个top,能用to咱们尽量用,所以说为什么你们在学那个map的时候,它的底层实际上一段这个K86底层已经是temp来做的,好这个大家注意一下啊,Temp说完了以后呢,我们讲了一下这个list啊讲了list,那list呢,我们首先说了一下不可变的。啊,说了一下不可变的啊,然后呢,我们历史的讲完,我们讲了一个历史的buff分啊,历史的buff分呢,就是可变的就是可变的,历史的有点类似于我们Java里面的A啊,有点类似于这个玩意儿啊,它可以呃动态的增加,也可以进行删除,那下面呢,我就给了一些案例,也做了一些说明,那具体的这个用法我就不再一个过了啊怎么加。
18:03
对吧,怎么这怎么怎么怎么删除对吧,怎么删除,我这都做了一些说明啊,做了一些说明,那这些基本的大家在开发中已经够用了,讲完这个类似的buffer呢,我讲了又一个数据类型叫Q队列,那么队列这个应用场景呢,就是一般来说像排队啊,只要是涉及到这个先进。后先进先出的这种业务逻辑,我们就可以使用Q来解决这个问题,对吧,那现在呢,这个下面呢,就有各种具体的实现。啊,什么用数组啊,面表这个底层我没有去讲,我直接讲的是它的具体的应用怎么创建,怎么追加,怎么删除,好包括他这个初队列,还有这个呃,出队列,还有这个就是进队列的操作啊,这呢我都做了一些说明,这个讲完了以后呢,我们讲了另外一大块的那种叫map啊,这个map上讲的东西就相对来说比较多一些啊,那这边有各种用法,我都做了一个介绍啊,别人问到你map底层是怎么实现的,要注意啊,是闪裂的形式。
19:10
闪电的形式。好,那么下面的每一个代码我就不一个念了啊,各种什么创建对吧,怎么创建,创建下面有几种形式啊,然后呢,又是构建不可变和可变,然后取值的方式又有多少种,然后呢,对它进行添加修改删除的操作,对不对,这些呢我都做了介绍了,后面呢,我们讲了这个集和赛啊,就集集的概念,Sat呢这块我讲的相对来说没有那么多,是因为它在实际应用中呢,相对没有像前面我们讲的sequence和map运用那么长,场景那么多,所以说我这简单的做了一个介绍啊,但是呢,也也说了啊,怎么加呀啊删除啊,我也讲了。好,同学们,呃,包括便利这个呢,就是我们上一次课讲的内容的简短回顾。
我来说两句