00:00
那么枚举类和注解呢,我们就说完了,说完以后呢,我们接着来讲下一章,叫做Java集合,哎Java集合呢,对于咱们这个整个Java语言这个高级部分来讲呢,也是非常重要的一章,那它和我们这个多线程,像这个IO流,像这个呢,就是明显的属于并列关系的,就是解决呢多个线程共同执行的问题,这呢就是叫多线程,涉及到这个数据存储呢,就是集合啊,涉及到数据的一个传输啊,这个从这个硬盘当中啊去读数据,包括写入到硬盘,这叫IO流,那其实这几张的话呢,先讲谁后讲谁呢,无所谓,就是涉及到不同的API了,那这一张呢,也是比较重要的一张,那我们来看一下这里边呢,具体的内容啊,叫Java集合。嗯,扎va集合这章呢,主要讲的这个知识点的话呢,就涉及到这样一些啊,主体呢我们看到也是一些API的使用,当然呢,这里边我们讲解的话呢,还会讲的稍微深一点,不管呢告诉大家去调哪些方法啊,同时呢,也要看一下底层源码是如何实现的啊,就稍微呢深入一些,那这里边呢,首先是一个概述,接下来呢,提到了两个主要的接口,一个呢叫做collection接口,一个呢叫做map接口啊这两个接口呢,是并列关系啊,是并列关系,存储数据的特点呢不一样,那么对于collection莱来讲呢,它又提到了两个具体的子接口啊,List和set,那咱们讲的话呢,肯定不是去讲接口了,那讲的呢都是接口的,它的具体的实现类啊,包括方法呢,也都是得有方法体的,这些方法啊,那但是呢,这个接口我们说定义的是一种规范,所以我们要关注一下具体的这些啊,Collection也好,List也好,Set也好,Mac也好,这些接口定义呢,是存储数据的什么样规范,或者换句话说呢,他们存储数。
01:42
数据的话呢,这个特点又有什么不同,这个呢是比较基本的一个点,需要大家掌握的啊,学完这一章最基本的需要掌握的,你得知道什么类型的这个数据,我们适合用哪种结构呢去存储,这是最基本的一个问题了。好,那首先的话呢,我们就涉及到关于Java集合框架的一个概述啊,我们来看一下这呢有一段话啊,说一方面面向对象语言呢,对事物的这个体现都是以对象的形式,是面向对象编程的,那么为了方便呢,对多个对象来进行操作,我们呢,就需要对这个对象呢进行存储。
02:21
这里呢,提到一个点,就是对多个对象进行操作的,那对多个对象呢,统一的进行操作,存储的话呢,咱们其实已经讲过数组了,那这里边的话呢,我们要谈一谈这个数组啊,在存储多个对象的一个方面呢,哎,它有一些弊端,那因为它的这些弊端的出现导致呢,咱们诶要讲另外一个更高级的内容,就是我们这一章要谈的集合啊,首先的话呢,我们获取到的一个知识点,就是集合也好,数组也好,它都是对诶多个啊,我们叫对象,或者你先泛成就是多个数据吧,来进行统一的存储的啊这呢就是他们的一个作用,就像是一个容器一样啊,就像是一个容器一样。
03:09
行,这呢就提到了这个集合,首先它的一个作用就是对多个对象呢进行存储的作用,和我们前面讲的数组呢,哎,从这个方面泛泛来讲是一样的,他们都是一种容器啊,那么既然这里提到了说数组有一些弊端,那我们就要先来谈一谈数组有哪些弊端啊,导致呢,我们不得不呢去用集合啊,就这样一个事情,好这块呢,首先咱们这个新建一个包,在这里边呢,我们写相关的一些注释信息,嗯,这个我们叫一个Java,嗯,JAVA1啊JAVA2。这个下边呢,我就不妨呢先去建一个就叫做collection了,哎,它的一个测试行,第一个呢,是关于我们这个叫集合框架的概述,哎首先呢,我们提到一个问题,就是这个集合也好,数组也好,它们呢都是用来对多个数据呢进行存储的啊集合和哎这算是第一个点啊集合和我们的之前讲过的数组啊,都是对哎多个啊数据进行哎存储操作的。
04:27
啊,这个结构啊,这个呢我们可以,呃,泛泛的呢,就称作呢叫容器啊,或者就简称为叫Java容器,那容器的话呢,就是我们来装东西的,大家喝水的话呢,用的是这个杯子,杯子呢就是一个容器,那书包的话呢,是装电脑装书的,那书包呢也是一个容器,那么我们对于这个集合也好,数组也好,它也是一个容器,它呢是装对象的,或者泛泛的说呢,是装数据的,这个数据呢可以装不止一个啊,可以装多个,那我们就叫做一个Java容器啊,就是这个意思啊,先大家有一个初步的一个了解,因为前面数组讲过了,所以它俩作用一样,诶我们也就知道集合是干什么的了啊,那这里呢,要注意一下,我们提到了这个存储,这个存储的话呢,咱们目前呢,都是针对于内存层面进行存储的。
05:19
啊,这个我们在这相当于是一个,哎,说明啊。说此时的这个存储主要呢,指的是哎,这个内存层面的这个存储数据呢,还是在内存里边不涉及到这个硬盘的存储啊,哎,不涉及到硬盘呢,就叫做这个持久化的存储,这个持久化存储呢,就涉及到一些具体的媒介了,就是我们比如说硬盘是吧,呃,硬盘或者我们这个这个服务器当中,数据库当中,其实都是一些具体的一些持久化的一些设备了啊,比如说你把这个数据呢,存储到我们这个叫点,比如说T文件当中,呃,放到这个点JPG文件当中,放到我们这个,呃,Avi的这个文件当中。
06:07
是吧,哎,这个还有放到我们这个数据库中等,这个呢,都是属于这个持续化层面的。咱们现在的话呢,都是这个内存层面,哎,先明确一下这个问题啊,那么咱们讲IO流的时候呢,就来说一下这个持续化这个层面的事情,先是明确第一个事情,然后第二事情呢,我们提到个点,前面呢,既然我们讲过数组了,为什么还要讲集合这呢,就涉及到数组在存储多个数据层面呢,有一些弊端,哎,那这呢,我们就来提一下说数组在存储多个数据方面的啊这个这个点啊,这个点的话呢,我们分成两个事来说,第一个呢,先说一下人这个特点啊,先别着急上来就说人家的这个缺点。是吧,哎,先说一下这个特点是什么啊,然后呢,咱们再说一下它这个缺点啊,那这个特点数组想想它有什么特点啊。
07:01
对,咱们当时讲说这个数组呢,它一旦初始化以后,哎,初始化以后它的长度是不是就确定了,哎,其际长度呢,就确定了,这个呢是它的特点,这个点呢,就是言外之意就暴露出它的一个缺点来了,就是对我们就不可对它的长度进行修改了,那这呢,呃,不能修改算缺点了啊特点呢,那就算这个了,那另外的话呢,咱们定义数组的话呢,也需要指明数组的一个元素类型,对,比如说啊,你是一个string类型的一个数组啊,这就相当于这样一个声明了,那比如说你是定义了一个int类型的一个数组。啊,这就这样子的,通过这两个声明,我们就知道人家元素的类型是什么了,啊,那言G呢,就是数组呢,我们一旦定义好以后啊,它的元素的类型呢,也就确定了。
08:00
A的,呃,定义好啊。一旦定义好啊,定义好啊说其元素的类型啊也就确定了,那么就使得呢,我们往这个数组当中,或者说叫这个容器当中去,这个装数据的话呢,也只能是装人家声明的这种元素类型的数据啊,其元素的类型也就确定了,那么我们也就只能啊只能呢去操作这个指定啊类型的这个数据了。诶,当然呢,在这方面呢,还会存在这个多态型啊,如果呢,我们这个类型呢,声明呢是一个,呃,比如说我们用的是一个object类型。诶,Object类型的这样一个数组,那其实我们在往这个数组里边装数据的话呢,是不是也会表现为这个多态性啊,诶你可以装呢,哎,比如说object子类,比如我可以往这个数组当中去装string也是OK的啊,这是这样一个点,这呢我们可以看成是数组的一个特点。
09:10
这样两个,那么接下来我们重点来谈一谈它这个缺点,数组在存储多个数据方面的点,哎这个缺点呢,很多都是很多时候呢,也是基于它的这个特点来的啊缺点什么缺点对,就是你这个一旦初始化以后呢,长度就确定了,长度确定了就接着不能再去修改了啊出一旦初始化以后,其一哎长度就要,哎不可修改,这个呢,不太方便,这个不太方便,那举个例子,咱们这个前一天讲这个string的时候,咱们做了这样的几个小的题目,这题目里边咱们就提到过一个说呢,计算两个字符串的最大相同子串,那如果说你只有一个,咱们就返回一个string没问题,那如果要有多个这个长度一样的啊那。
10:11
这个最大相同纸块了有多个,咱们说因为没有讲集合,所以只能用这个数组去装,但数组去装呢,我们必须呢先指定数组的长度,这个长度呢就比较尴尬了。你说你指定三个,万一它要有四个呢,装不下啊,就是说我们对它这个长度进行扩展的话呢,就非常的不方便啊,那这呢可以看成是我们的一个例子,包括呢,咱们前面讲了一个项目也是一样,组建开发团队,咱们呢定义了一个programmer的一个数组。呃,这个数组的长度呢,还有印象的话呢,这个咱们是五是吧,哎,长度是五,那如果说后期咱们这个开发团队的话呢,这个呃。工作量比较大了,那后边的话呢,我们需要对它进行扩容,那扩容的话呢,你这个长度是五,这个显然量就不够了啊,这就提了,这就算是它的一个弊端了啊,那言外之意呢,就是我们集合呢,能解决这样的问题,就是比较方便的呢,对它进行一个扩容了。
11:09
或者你可以泛泛的先理解为呢,集合里边长度是可以修改的啊行,这呢是我们说的这个问题,那除了这个问题之外呢,还有没有别的问题。除了说它这个长度呢,是确定的,不能修改了。类型怎么了?类型单一还是啥?类型怎么了,类型单一啊啊,类型单一是什么意思呢?啊,你指的是就是如果它声明成是死润型,就不能放非死润型的是吧。这这算好处还是不好的地方呀,这其实算算好处啊,这算好处就是相当于它更严格,它更严格就是我们写的是此类型,你就不能放别的类型,你要说呢,这个写的是某种类型,或者说没有明确确定是哪种类型,什么都能放,其实这个事儿呢,不太好。
12:18
这样的话呢,会导致你这个不严格,或者换句话说会有漏洞,有漏洞呢就很麻烦,就会容易被人攻击是吧?啊,或者就会出现一些这个问题啊,出现一些异常,其实呢,它越严格呢是越好的啊,或者再换句话说啊,就是我刚才其实已经解释了,再换一个角度去解释,那我定义症,我不这可能不一样吗?你想我这个类型单一,我定义成object随便放,这就类型不单一了吧,那你任何一个对象不都是object的子类吗?这不就解决你说的类型单一的问题了吗?那其实这个点呢,算人家的一个好处哈,就是你想单一就单一,你不想单一还可以object是吧?啊,这个是好处啊,还有吗操作。
13:04
嗯,角标对,我们操作这个角标的时候呢,可能会出现控制针是吧?嗯,出现控制针,当然咱们要用集合的话呢,也可能出现是吧,就是这个呢,就是你你不好我也不好是吧?嗯,这个咱们现在谈呢,还得谈点说这个诶你这不好,我这能解决的啊嗯,当然这个呢,对,当然这个也是一个问题,就是我们在操作的时候呢,其实就相当于发现呢,咱们这个数组啊,它提供的功能呢比较少,除了呢,我们给这个这个生命完以后有一个烂S属性之外呢,基本上没有什么方法了。当然了,数组也可以用咱们object里边那些方法啊,但其实也也也很无聊是吧,Object里边那些方法呢,其实都是比较基本的方法了,我们毕竟是重装的,重装数据的一个容器,那就涉及到对这个容器里边这个数据呢,我们做的操作呢更丰富,比如说。这个对,删除啊,插入啊,添加呀是吧,嗯,甚至还有其他的一些这个功能啊等等我们想做的呃事儿挺多的,但是这个数组呢,都没有给我们提供,还得让我们自己呢去通过角标去调,那我们呢去调角标呢,就很有可能会出现一些呃控制人呃这个角标越界的一些情况。
14:18
哎,所以我们把这个合成一起啊,相当于写一点,就是说数组中这个提供的这个呃方法啊非常有限,诶这个对于诶我们说的叫添加去添加到也还好是吧?啊尤其呢是我们这个要删除数据或者是叫插入数据等操作啊,非常不便。嗯,比如说呢,我们现在有个这个数组,我这呢是一个两个三个四个五个元素,我现在呢,想把这个第三个元素删掉,咱们当时不也做过类似的这样的项目吗?你得把这个后边往前移,需要我们自己去移,最后那个no啊,然后呢,你要是有表示这个长度呢,还得去偷偷减减是吧?啊如果呢,我们想往这个123第三个元素这块呢,插入有元素,那你这个元素呢,还都得往后移,把这个呢空出来,然后把这个元素插进来,这事的话呢,没有现成的方法可以用,我们都得必须自己去做啊,都得必必须自己去做,而且的话呢,数组这种结构呢,只是我们数据结构中的一种,它这种插入方式呢,其实效率还比较低,我们讲集合的话呢,集合呢,涉及到数据结构呢,就比较丰富了,像其中的这个链表结构呢,它实现这个插入操作呢,效率又非常高,所以说你这块讲数组的话呢,一方面就非常不变啊,同时呢效率也不高。
15:45
哎,这是这个事,嗯,这是这个问题,那接着还有一个的话呢,就是咱们在项目里边,比如说呢,我们造这个数组的长度呢是十,咱们往里边呢添了三个元素,我现在呢,想获取一下你到底添了几个元素。
16:02
咱们是不是都得自己去定义一个所谓的叫total的一个变量了,那每次你添加一个,我们让total加加一下,说最后有几个,看看total是几。哎,本身这个数组也没有给咱们提供一个现成的属性或者是方法,说你里边有几个元素啊,所以这个呢,也算是一个不太方便的事儿,这个,而且咱们还经常用这样的问题啊,就是呃,获取这个数组中啊,嗯,叫什么实际元素的这个个数啊,这方面呢,我们数组的这个需求啊,啊数组呢没有啊,这个现成的这个属性或者是方法呢,可用。哎,这呢算它的一个,呃,也算缺点了,那还有吗。哎,再有一个点呢,其实就不太容易想啊,这个咱们也是对比着这个集合,相当于我这块呢,反过来给大家去说一下他们的不同点了,其实啊,还有一个点什么呢?这个数组啊,它呢,诶,它存储数据这个特点,存储数据的这个特点,特点是什么呢?它其实是有序的,它其实有序的就是你填了第一个就填第二个,填第二填第三个,中间不能有空。
17:26
就像咱们说呢,你删了一个数据呢,就得把后边那个往前移啊,这个就叫有序性,那有序性同时呢,它呢还可以去存储重复的数据啊,叫有序可重复啊,那么对于这种无序的这个需求,或者是有一些数据呢,要求放在这个容器里边呢,不能重复,呃,这个需求咱们呢,数组是不能给他满足的。啊。
18:00
当我们放到一个容器中的一些数据要求呢,说里边不能重复了,那这个呢,数组做不到啊,数组呢,这里边是说你可以放一些重复的数据是没问题的啊,有些数据呢,我们还不讲究它的一些顺序,就先放谁后放谁无所谓啊,那这个时候的话呢,我们这个数组呢,也不行,它呢都是有序的啊,那这样的话呢,我们数组呢,呃,就比较单调一些啊,它只能做这样的事情,那这呢是我们罗列出来数组在存储数据方面的一些缺点啊,啊一下呢举了四个。以前呢,讲集合之前呢,用数组用的感觉还挺好的是吧?啊有数组呢,我们做很多事呢,还是非常方便的啊,那现在有了数组,有了这个集合以后呢,开始就说数度这儿不好,那不好了是吧?人呢好像经常来这样啊,叫喜新研旧是吧?嗯,那这个心呢,就是我们的集合,这个集合呢,这里边提到的这几个点,集合呢全都可以满足,从这个层面上来讲,我们用集合呢会更好,会更好,但是从另外一个角度来讲呢,旧的呢啊也不能抛弃是吧?啊数组呢,在很多时候呢,我们也得用啊,也得用,或者再换句话说啊,你觉得用集合用的挺好,结果呢,你一看集合的源码会发现。
19:18
集合里边用的也是数组啊,你想把数组扔了,那压IG呢,集合也得扔是吧?哎,那他们呢,其实是有相关性的啊,是有相关性的,哎,是我们从这个实际开发的需求上来讲说呢,这个数组这个很多时候让我们自己去调这个角标啊,确实非常不便啊,那我们最好呢,还是体现面想对象的特点,呃,封装一个类,然后类里边呢,提供一些方法,我们直接呢,拿着这个类的对象啊去装数据,去调离方法呈现呢它的一些呃,很有特色的一些需求啊,天山改茶这呢,就是我们有这个集合这个框架的一个,呃,很正常的一个需求啊,那同时呢,这块我还举了一些例子。
20:00
呃,这个例子的话呢,咱们其实在讲数组的时候呢,啊也提过啊也提过这呢是一个手机端的,大家呢看到的这样的一些这个数据啊,真的是一个呃,外卖的啊,那其实你把这个图标呢,跟这个文字呢,你稍微换一换,这个里边这个相当于是个文本框调一调,这就其实有新闻的是吧,还可以来回改嘛,啊其实这个很多应用这个呈现的效果在移动端呢,都是这个样子的啊那么这呢是一个智联招聘啊,列举了一个Java的一个招聘的一些岗位啊一些薪资是吧?哎,当然重点你不是看这了啊哎,现在想要说的呢,就是这呢,一个一个的也是啊,一项一项的这个内容叫做一个item,那么这一项一项的话呢,其实我们在Java层面呢,就可以看成是一个对象了,那压G呢,就是我们这里边呢,会涉及到很多的对象,那这么多对象呢,你肯定不能说我就把它们散着放啊,说每一个呢都定义成一个变量,然后呢,要用到哪个我就让哪个呈现,这显然呢管理起来非常不便,那我们。
21:01
呢,就会统一的把这些包括下边没有呈现出来的这些数据呢,都用统一的一个结构或者叫容器去重装,这个也一样,每一项呢,作为一个对象,整体呢用一个容器去重装,那么这个容器之前呢,咱们提过说用数组做OK没问题,但是数组呢,毕竟操作起来可用的方法太少了,实际开发当中,咱们考虑到的呢,都是用集合啊,都用的是这个集合了,这呢相当于是举了一种实际应用的场景啊,那这呢,比如说是我们的第一项,其实呢,就取集合里边的第一项就可以了,然后集合里边的第二项,然后你往上滑的时候呢,我就不断的从集合当中去取啊某一项,哎,让它呢,哎调出来就可以了,哎,这个也类似,行过了,这是一个需求啊,另外一个需求呢,这呢我列了一个这样的一个框啊,这呢,比如说是我们的安卓客户端,或者呢是浏览器端一样啊,这呢是我们的服务器端,这是我们的这个数据库。啊,那客户的话呢,不管是浏览器也好,还是这个安卓客户端也好,那用户的话呢,经常会去请求一些数据,就比如说呢,你请求的是这些数据,是这些数据啊,那这些数据具体的话呢,是怎么走的,我们这有一个简图啊大家呢发送一个请求。
22:14
换个颜,嗯,换一个什么颜色,这个吧,大家发送一个请求,就是我想查看一下附近都有哪些这个饭店是吧,你把这个请求一发送这个呢,就发到这个,比如说美团外卖或者美团的一个后台服务器了,服务器呢,这块基于你的位置呢,开始去数据库中去查询,查询完以后呢,他会把这个数据呢,给你先返回到后台这儿,后台这块的话呢,哎,这块先呢,我们这个从数据库查完以后呢,这不都是一个一个对象吗。一个对象,但是这个对象呢,我们在给这个通过网络给客户端的时候呢,并不是直接发送的对象。这呢我涉及到一个说明,说呢你这有多个对象啊,我们呢,把这个Java对象或者呢,你要有多条数据,就是对象构成的一个集合了,这个list呢,是我们啊集合框架当中具体的一个接口,嗯,转化成这个list啊,不是先获取到的,从数据库拿到的是一个list,嗯,这个list的话呢,我们传输的时候呢,不是说拿着这个对象呢去传了,而是呢,我们把这个list呢,转换成一种叫杰森格式的对象。
23:14
啊,或者叫做数组,这个杰S呢,本质上来讲,它实际上是死锥类型的啊,就用双刃号引起来的一种特殊格式的这个字符串啊,子物串就相当于呢,我们把这个呢结构给它传输了,传输的这个过程当中,在网络中传的呢是润,因为润呢,咱们讲常类的时候呢,说这个哥们呢是srelizable的。可序列化的是吧,可序列化呢,就指的它可以通过网络来进行传输啊,那传过来以后,那我们拿到这个客户端这块呢,你不能拿这个杰森数据了,我们就需要把这个杰森的数据呢,再转化为诶内存层面的集合,哎这呢就是属于我们集合中的一些具体使用场景。一般呢,我们都不爱去给它转成数组了,因为数组呢确实方法太少了,我们得自己呢去调脚标来写啊,挺不方便的啊,所以我们都会选择用哎集合来做,行这呢我们就对这个呃,集合框架呢,首先有一个简单的了解。
我来说两句