00:00
诶,刚才呢,咱们提了一下Java当中这个集合框架里边涉及到的相关的接口,包括呢,具体的一些事线类啊,它的一些主要的这个特点,然后呢,我们这个课件里边呢,是不是也列举出来了相关这个图啊,这呢是比较全的一个图啊,看着感觉哇,好多一篇呀,是吧。啊,里边有一些接口,有一些呢,具体的实现类了,诶等我们这章讲完之后呢,其实大部分这块呢,我们其实都会涉及到,所以这里边儿呢,明显的一个特点就是什么呢?容易乱是吧。啊,你说哎呀,这个类接口是谁呀?特点是什么呀,它跟彼此之间的实现类之间有什么区别呀,所以这块呢,记忆量呢可能会有一些,但是呢,大家呢要把握重点,重点呢就是先关注于主要的实现类,换句话说呢,你说我这俩这俩我也不知道他们的特点是什么,我也不太会用,其实呢,写代码话呢,影响也不是特别大。啊,你只要呢知道呢,我们用它的主要时间类大概率都没问题是吧,只是说呢,在一些特别的场景下呢,我们可能就没有用它了,而是用的它,举个例子是吧,我们没有用它,而是用的它,这个呢,你再作为一个补充内容去关注一下就可以了。
01:05
好,然后呢,后来下边这块呢,我是把它又画了一个简图,涉及到我们这个collection体系和这个map体系的,这里边儿一定要注意,这个map呢跟我们这个collection呢,是两个并列的体系,千万不要把这个map呢理解成是collection collection的这个子接口了。啊,有的同学呢,可能会这样认为是吧,其实不是的啊OK,然后下边这块呢,我也放了一个使用的这个场景,以前的时候呢,我们讲数组的时候呢,也说过这样的场景,其实这时候呢,我们会发现以前呢用数组的时候我们就可以使用。诶,这个list下边这个呢,去做一个替换了。那比如说这呢,是我们的客户端,这个呢,是用的这个网页啊,端呈看呈现给我们的啊,在这里边儿的每一项呢,咱们都可以理解成是一个具体的对象了。所以这里边儿呢,我们会看到呢,有多个对象,多个对象的话呢,我们考虑用一个容器呢去装,这时候呢,其实上下呢,也是有这种顺序的一个讲究的啊,我们就可以呢,原来用数组,现在的话呢,我们就可以用这个list的具体的实现类,实际上呢,就是a release。
02:05
去装就可以了。其实大家你看这个呢,他这个名字起的呢,都很有特点。Ara list是吧?这个RA呢,其实就是数组的意思嘛,List就是我们平常说的叫列表了,所以这个a list呢,其实就是由ara构成的一个列表,换句话说,A瑞底层呢,还是数组。那为什么还要换呢?你想数字里边方法不是特别少吗?呃,给你封装起来呢,A release里边好多方法,直接拿过来调不就完了吗?所以更方便呀,所以我们就用a release呢,就替代于这个数组了,然后在网页端呢,也同样的道理,这里边呢,你看都是一个一个的这个数据,那你可以理解成呢,就是这个,哎,Ari呢,可以去装这些数据了。诶,这是它的这个场景,然后具体我们来看这一项的话呢,刚才我们提到了说可以用一个对象呢,去封装我们这里边儿这个数据,那也可以呢,不用对象还有一个容器。啊,用哪个容器呢。这时候我们就可以用这个map容器了。
03:02
啊,Map呢,叫建制对特点的是吧,那这时候呢,你看我们这里边的这有一个结构啊,这有一个结构,这里边凡是你能看到的是吧,这也是一个结构,这也是一个结构,像这些的话呢,我们都可以呢,用一个key key呢你可以理解成是个标签,比如这个K呢,在它这儿就理解成叫imagine。是吧,这个或者你再换个。我们这个图片的一个路径是吧,就是这样的一个字符串了,然后呢,这个呢叫好伦哥是吧,这个呢,你可以理解成它就假如咱们就起个名就叫name。这呢就是你这个它的这个值,然后它呢,对应的呢,就是你这个图片的那个地址是吧。啊,其实上是一个URL了啊,一个地址,然后这个位置呢,对应的就是我们说的叫豪伦哥括号回龙观店,这不就是舰值建值这样特征的吗。哎,这呢,就是相当于具体的这个内部呢,相当于是一个map了,然后多个map呢,构成的一个list。在这个里边呢,没有set的场景。
04:01
或者换句话说呢,咱们在实际开发当中啊,咱们用的这个,呃,List和map呢是比较多的,Set的使用场景呢是比较少的。啊,这个注意一下。好,那么我们这个再拉回来啊,然后这块呢,我又放了个图,这块呢是一个更宏观的角度,比如我们是安卓的客户端,或者是这个PC端的浏览器是吧?然后呢,诶发送一个请求到服务端,服务端呢我们可以用Java代码呢去编写这个逻辑了,然后Java呢,还可以去访问数据库,数据库呢查来查回来的这个数据呢,叫结果集,给了我们这个Java层面的这个代码,然后我们再响应给我们的客户端,最后呢,你就能够看到这样的数据了。这个数据呢,本质上来讲是不是都是来自于数据库了。对的啊,然后我们Java的作用呢,就是根据用户的这种个性化的请求,我们去访问数据库,查的结果呢,返回客户端,那么在我们的这个服务器的这个层面。那我们写的都是Java代码,我们呢,就可以针对于刚才提到的这个数据呢,咱们使用这个list或者是这个map呢,来去装这些数据。
05:04
OK啊,然后具体呢,返回的时候呢,哎,这又是什么格式的,这个咱们现在就不多说了,哎,这是一个简图,OK好了,那下边的话呢,咱们就具体来看一看这些接口和时间类的一个情况,这呢也是咱们这一章讲的一个重点问题啊,就是第一个这个事儿。那首先要讲的自然而然的就是collection,但是collection呢,又是个接口啊,接口这有啥可说的呀,或者我们要想演示的话呢,接口里边呢,诶,我们在GD8里边提到说有些默认方法了啊,但更多的时候呢,它体现的还是一种规范,那既然叫规范呢,其实我们更多的关注的还是一些抽象方法了。啊,那抽样方法的话呢,我们要想演示一下它里边都有哪些方法,你得选一个具体的实现类了。啊,去看看这里边儿这个功能都是什么。是吧,诶这样一个场景啊,所以呢,这块,呃,针对于这个list也好,赛也好,里边呢,既然呢,他们都是操作一个一个的数据了,它应该有一些共性的方法,所以咱们先来讲一下这个collection OK。
06:03
好,这块我们就先又建一下,哎,新建一个叫关于collection的一个测试。采过来啊,这块我们主要来测的就是collection,它下边定义的这种规范,实际上就是一些方法的使用啊。哎,测试。哎,Collection当中啊,这个方法的一个使用。通过我们测试这个方法呢,大家知道呢,我们去存储一个一个的数据的时候呢,都有哪些功能呢,可以去调啊,那list实验类可以调,赛实验类呢也可以调。那这块呢,咱们刚才提到了,因为你是一个。接口嘛。所以这块呢,我们要想去演示这个方法的话呢,其实只能是呢,先声明是一个。Collection比如叫CR了是吧,那右边这块呢,一定得选个时间类了是吧。你有个对象,那不妨呢,咱们就先拿这个叫A。哎,拿它来充当一下。这呢,我们是不是就使用了一种多肽啊?
07:01
好,那下边呢,我们去调的时候呢,咱们说了多肽的场景下,我们去点的时候呢,是不是只能够点出来collection当中声明的这个方法。对,所以呢,我们就借着这个啊,来去看一看它里边方法。当然我们要具体执行的话呢,是不是肯定还是他里边来。哎,没问题啊,但是呢,这块你算是他的吗。啊也算,因为咱们说了这个接口中定义这个方法呀,虽然说它没有方法体。但是这个方法是做什么的,其实是确定的是吧。诶,所以这块呢,其实不影响我们去理解这个collection中的这些方法啊,好,那么CTRLC一下。我们这块呢,就可以呢,在这儿先看一下这个API啊。这个位置的话呢,我直接拿过来啊U下的,然后呢,下边就有一些具体的方法了,注意这个在JDK8的时候呢,它其实加了一些静态方法或者是默认方法了,这块呢,咱们暂且先不关注。后边我们讲到这个stream API的时候呢,再说啊,所以我们暂且关注的都是abstract methods啊,就是这个抽象方法啊,方法往下一拽,哎,就这一波啊,数一下多少个呢。
08:08
15个。啊,这个我就告诉大家啊,15个啊,那咱们看之前呢,先收起来。啊,咱们呢,先思考一下啊,如果我们自己去设计一个collection。来存储一个一个的数据,你会设计哪些方法呢?啊,增删改查是吧。嗯。还有吗?排序排序。也可以是吧,啊排序。啊便利啊,查询的话呢,你这只能查查一个是吧。啊,查一个的话,你自己加个方循环就也能便利是吧。或者说这块呢,还有没有别的便利的方式啊,还确实有啊,这个就使用迭代器了,还行,这也算一个。还有呢,比如说你这里边儿有几个元素啊。是吧,就获取一下你这个元素的个数。
09:01
是吧,还比如说你这个及格中是不是空的呀。哎,我们这个string不也有这样方法啊,Is MC是吧。嗯,还有呢,比如说你是不是包含某一个元素啊。是吧,或者我这有一个集合,跟这个集合,我们求一下你们的共同的交集的元素啊啊等等类似的啊,其实呢,就是这样一些方法啊,大家呢,说的没错啊,就是刚才提到了一些方法,只不过呢,大家刚才提到增删改查这个查的时候呢。对于克莱来讲,因为它是比较泛泛的去定义这个添加数据的一个接口了,他呢,其实在查这方面呢,稍微的差点意思。啊,为什么讲呢,因为你像这个set的话呢,它是无序的。啊,你说我想找第一个元素,是不是都没有所谓的第一个之说呀?Set是无需的,那CLA呢,就是它的这个负接口了,所以它这里边儿呢,也没有办法呢,说我就想找哪一个元素。他也没有这样的能力,所以在查询方面呢,你发现的这个呢没有。
10:01
啊,他就没有了啊。但是便利的话呢,还是有的。来总共这个方法的话呢,一共是这么多。啊,咱们呢,讲一个结构的时候呢,很少说把一个结构中的所有的方法呢,都去测一遍的。而且这个方法你看还不少,但是对于collection来讲呢,咱们可以呢,或者叫有必要呢,把这里边的方法呢,给大家呢,都稍微的过一下啊好,那么首先的话呢,我们就看一下这个啊,一波一波来啊,先看第一波这个,我们直接来看这个课件就行。先呢看这俩。这呢叫添加。哎,先放到这儿啊。这样了。好,这个添加的话呢,第一个呢,叫添加一个元素啊,你会看到,诶我这怎么写了一个E类型的是吧。这儿呢,其实我们在这个莱声明的时候呢,他带上这样一个泛型啊是吧,当然咱们还没有讲泛型,所以大家呢,你就当没有看到这个东西。啊,那这个时候呢,我这个呢,E呢,最好呢,就给它改一下就是object。行,你就看成是object就行,然后呢,诶,我们来测试这个叫艾这个方法,通过这个需要点我去at,你看这不就是object行了吗。
11:06
哎,我就可以呢,去添加一些数据了,比如这个AA是吧。啊,这个我就快速的去加一些数据了,整个这个A,然后加个123行。既然可以了,你看没报错。对这个怎么理解呢?对这个呢,123呢,我们看似呢,是一个基本数据类型是一个常量了,但是呢,没报错呢,其实是自动装箱了啊。啊,因为呢,咱们这个通过这个CU点的时候呢,就这一个方法只能是放object,所以理解成是个装箱的效果啊。嗯,再放一个有字符串。比如放个哎,上硅谷是吧。这个字的话呢,我觉得应该挺好认的是吧。对,但是这个字的话呢,好像很多人都不认识啊。啊,各种各种叫法是吧,这个我记得最早的时候呢,实际上呢是呃商务刚有的时候呢,然后那时候呃,我我跟几个老师出去呢,去做那个广告牌嘛,亚克力是吧,然后印象很深,那个哥们说,哎,你们这名起的挺好。
12:07
啊,刚刚还没激动呢,然后说叫上瓦鼓是吧,嗯嗯,有要上瓦谷,有要上硅谷啊,昨天那个外卖过来说给我放到三楼了,我说你对你就放那儿就行,他说你这是上加谷吧。我就郁闷了是吧,这个字好多人竟然都不认识啊。这个呢,我再放一个字符串,再来一个,这呢我new一个object吧。哎,这个也放进去了啊。好,然后呢,为了我们演示的方便,我这儿呢在创建一个自定义的类,然后呢,造一个自定类的对象,那不妨呢,我们就还拿person来说吧。啊,来一个,比如说真性的name啊,In性的age,这咱都比较熟悉了啊,啊接着呢,提供这个构造器啊,比如这空餐的。啊,然后代餐的。哎,这样是吧。嗯,这个盖塞的方法的话呢,也可以提供啊,如果你这块呢,给它加上private的话呢,我们再加上盖赛的方法,这个我就简略了啊,然后呢,我们再去提供一个to string。
13:06
好,暂且的话呢,我们就先写成这样子,回过来这块呢,我们去一个。哎,你有一个这个person。比如这个呢,叫汤姆啊,12岁。哎,这样个情况啊好,那这样话呢,我们就添加了这样的五个对象了啊没问题啊,那接着的话呢,我们就啊C诶直接这块呢,其实它也有一个to string的方法的调用哈,然后我们做一个run。这个呢,其实就把我们这样的几个对象呢,就给呈现出来了,那就依次呢,这不就显示出来了,这个呢,因为我们是一个object,没有他自己呢图方法呢,就是打印这个地址值了。出来的就是这样一个效果哈。好,这个呢,我们就是添加元素,就一个一个的加。这样的一个情况了,然后它还有一个方法呢,叫at all哈,你看这个参数的话呢,又是一个新的collection。啊,你想这是什么意思啊?
14:01
对,就是把我们这个参数的这样一个集合中的元素呢,是不是都加到我们当前的这个集合当中了,是吧。对,就这意思啊,在这儿呢,我们就再举个例子,比如我们再去新建一个,我们叫C1吧。然后呢,针对这个CL1呢,我们再去加两元素。啊,这个就过来加一是加一个,比如说BB加一个456。哎,这样啊,好。CL1啊,然后呢,我们就调用一下咱们这个CL点调这个I的O。哎,把这个C21呢加进来,加进来以后的话呢,我们再去打印一下。好,这是我们直接看一下这个结果。哎,那么就在咱们原有的这个基础之上啊,这块你看又加了两个是吧。没问题是吧,哎,那么原来呢,这块是有五个元素吧。再加了俩,是不是就变成七个了?哎,所以我们也可以呢,呃,先调一下这个方法,一会儿也要讲这个方法啊,这个呢,就直接呢叫做size。
15:03
哎,就是获取我们这个集合当中元素的个数的方法,C2点我们第二个size,那么我们在艾二之前。这个我们也去打印一下这个C2点这个S方法这块呢,是不是就五个了。哎,你加了俩,这不就七个了吗。哎,就这个意思,哎,走起。哎,五个七个没问题啊行,这里边呢,有一个小细节啊,这块大家要注意一下,你比如说这个位置,我这呢叫掉的at all是吧,你看我要把这个给注释掉了。我调成叫。爱的方法,你会发现呢,这个C1呢也能够加进去。是吧,啊,因为呢,我们这爱呢,是可以填一个对象object类型就行,你任何一个类型的对象不都是object的这个实例吗。所以呢,也能调这个方法,那你说这个方法和下面这个方法区别是什么。对。这个呢,是把我们这个集合整体看成一个元素了是吧,所以这时候我们要执行的话呢,这个size呢。
16:05
对,就是六了。而你整个的这个集合本身充当了一个元素。所以这个大家要小心一点,你看你实际呢操作,你到底是想做哪个操作啊,诶我这呢也稍微的画了一个简图啊,就这样的,这个呢,假设是我们这个CR,这个是另外一个集合,然后呢,我们如果是调I的把这个放进来,你是把这仨元素呢,是单独的每一个都加进来的意思,如果你要调I的方法呢,是把它整体看成一个元素。那具体你想做哪个操作啊,大家你到时候呢,小心一点啊。这是我们说的这个问题。哎,这就过了,然后接下来我们看一下这几个方法。哎,CTRL一下。哎,粘过来啊这一波。好,这一波里边的第一个呢,叫做size啊,咱们刚才呢,其实已经演示过了,然后看一下这个其他这几个。哎,我不妨呢,就把这几个呢,CTRLC咱们粘过来。
17:05
哎,这个是我们的第二个啊,这样转过来。好,这里边儿这个object,比如我们把它呢,就给删掉吧,1234啊这四个好,首先的话呢,我们看一下刚才提到这个呢,叫is empty啊。那就他啊说判断一下当前这个集合呢,它是不是空的。哎,第二。Is empty啊,第二我们调一下这个输出,哎,是不是空的,显然呢,这里边是有元素的,它就不是空的。哎,所以你看这个呢,就是一个false是吧。Boss啊,然后呢,这个是怎么做的呢?你看我们点进来。啊,看这的话呢,它就进入到我们这个collection这个声明的这个位置了,所以呢,它是一个抽样方法没问题,那我们应该是不是看这release啊。然后CTRL f12,我们看一下这个叫is empty。诶,它呢,其实呢,就是判断一下这个size呢,是不是零是吧。这个size的话呢,其实就是我们到底存了几个元素。这个呢,你看上边这。
18:01
我们刚才不是调这个size方法了。就这意思啊,所以呢很清晰啊,然后这个完了以后呢,还有一个叫做。啊,这个叫contents是吧。Content的意思呢,说是不是包含某个元素的意思,哎,把它呢,我们拿过来。哎,这个呢,其实也比较清晰啊,比如说我们通过这个CL点啊,我们这个叫contents。哎,这块呢,比如我写个叫AA,说是不是包含AA。官方撒。哎,这个呢是个出啊,然后接着啊,我们再复制一份,说是不是包含123。这个呢?这有点没底气了。是处是吧,那我要改成128呢。啊,这个知识点从哪来的。
19:01
那就是为什么128就变成false了?大家就想到那个负128到正127的那个事儿了,是吧?啊,想到这块的话呢,是挺好的,但是呢就不对了是吧。嗯,来,我们走起一下,就是大家想的这块其实也对哈,但是这个结果呢,没说对哈。啊,结果咱看还是个处是吧。那这个呢,你觉得。是怎么回事?就是大家往那块想,其实是对的啊,就是这个128的话呢,确实是装箱没问题是吧,装箱的话呢,你这个写的是128,它其实呢,已经超出我们刚才说的那个数组的范围了嘛,也就说白了,这个是新new的吧。那这个位置呢,说是不是包含128,这个时候呢,也是新旧的一个,因为我们这个con刚才看到它不是也只能放object。所以这是两个新new的新旧的。他还说是个处。那说明它比的呢,就不是等等。也就是说不是比的地址了是吧。换句话说,比如说这个咱以商务为例吧,我这块我是new的一个string。
20:06
这样写的是吧,然后呢,我现在呢,又去复制一份,说是不是包含这个。加一个它哈,是包含的时候呢,我把右心new的一个string呢,放到这儿了。你说这时候是初2FALSE啊。对,也是出言,IG呢,就是它不是判断的地址。它是实打实呢,比较的这个内容是不是一样,相当于调的是eo的方法是吧,此类呢,因为都重写过了呢,也都重写过了,所以这块呢,他们都是出。好,那要是这样的话呢,咱们看一看这个person啊。我复制一份。我呢把这个CTRLC,然后这么着替换一下,你说这个时候是true还是false。看一下我们的person。这样写的啊。哎,是除还是放啊。哎,有同学不确定了。
21:02
我我我先这样一下啊,可能稍微有点快了,我在这个位置呢,我先一个P1这样写的是吧,把这个P1呢,我放进去。然后呢,我这个位置呢,说你是不是包含P。这出二。这肯定是出是吧,因为你这块比的就是P,这个P1的话呢,就是你原来这个显然呢是包含的是吧,但是现在呢,我不这样写的,咱们先跑一下啊。你看这是个出现代话呢,我们是直接new的哈。或者说呢,我这个位置还是放在P,我这个位置呢,是新的一个对象了。说按说这时候还是调E方法,那为什么看这呢?因为我们没有重写equals啊。没成也equal的话呢,那你用的就是object的equals。Equals呢,就是等等是吧。那这个地址跟这个地址呢。显然不一样是吧,所以这时候呢,就是。了。
22:00
哎,就成false了啊行那。一般的话呢,咱们调cons的时候,其实呢,都应该是就首先呢,我们看到他调的都是eo的方法了啊,既然他调eo方法,其实呢,就想比内容了。也就是说啊,咱们对于自定义的这种类的对象呢,如果想往集合里放啊,咱们都要求大家呢,把这个E的方法呢,得重写一下了啊,所以呢,就是out加insert啊,点这这个你就next next。啊就就行是吧,然后这时候呢,我们这个哈扣呢,其实用不着,诶我就暂时给注释掉了啊。好,这个呢,我就给重写了,重写以后呢,为了证明我们调过的方法呢,咱们也可以在这儿呢,我写上一个啊,比如说person里边的。E的方法啊,我这样写一下,好回过来这时候呢,我们做一个执行。首先哎,我们看到这个结果呢,你看是个出了,然后呢,你也能看到他调研过几次。是吧,哎,这个我们,呃,就是一开始呢,这是个false是吧,然后我们重建以后呢,就把它变成是个出了调用了四次。
23:04
这个事儿你看怎么理解啊?诶,其实这块呢,我们要说一下它是怎么比的哈,就是当我们判断是不是有这个元素的时候呢,我们要调用这个元素所属类的这个依轨方法了,调这个的时候呢,这个行参放在谁呢?行参呢就按照我们这里边这个顺序,因为咱这是用的list是有趣的了啊按照这个顺序呢,依次把这里边这个元素呢,都放到咱们这个E口的方法这个行参的位置了。比如先放进来的呢,实际上是AA不一样,这就掉过一次了。然后呢,接着你再把这个128呢,放到我们这个person的一会方法的形态又不一样,又调过一次第三个第四个的时候一样了。哎,是这样,那就意味着你看如果我把这两行代码呢,我往上提哈。我提到这儿了。那这时候呢,我们会比过几次啊?哎,两次就可以了。没问题是吧,哎就这样的好,那通过这个方法的话呢,我们想给大家说明一个点,就是说呢,我们如果添加的是自定义类的对象的时候呢,我们自定义类呢,咱们要去重写EQ的方法了。
24:09
他既然调一个方法呢,那说明他就是建议我们是比内容的啊。好,然后下边这个呢,叫contains all。这个能猜出来吧。对,你是否包含这个集合当中所有的元素,如果要是是的话呢,就是出,如果不是呢,就是false了,比如说我们再新来一个啊,诶我们,诶我先这样CTRLC。加二一。这个呢,一个AB,然后我们再复制一份来一个AB。啊,这是A是吧,再来一个BB。好,然后呢,我们拿着这个CL,点这个叫cons o,把这个CL1添加进来。哎,那你像这个BB呢,我们这里边儿没有。所以这时候呢,打印的就是一个false了是吧。哎,这不就是false吗?但是如果说呢,我们把这个BB呢,给它去掉了。
25:02
哎,这里边去掉,咱们再加一个吧。哎,上面有个123是吧。8012128哈。把它这个加过来了,诶然后这时候呢,我们再去判断一下的话呢,诶这俩元素是不是都在我们上面这个集合里边了。哎,所以这块呢,它就变成个处了。比较好理解啊。其实呢,就相当于是判断,如果呢,我们当前这个集合呢,画一个大圈,说contain all就是这个集合呢,要想包含就要么呢是它的一个真子集是吧,要么就跟这个集合长得一样才行。这时候呢,才能是个出啊好,下面这个叫equals,这个我就不测了啊,咱们说一下这equals方法的话呢,相当于呢,呃,有点类似于就是我们我们这里边呢,相当于也声明的这个方法的一个重写了啊。然后这个方法的话呢,行三也是object,要想哎,我们这样的一个集合调这个方法。啊,放一个东西。希望他返回是个处,你觉得这块呢,关于行三得是怎么着啊?
26:05
就是判断一下,我们调这个方法呢,是个集合,然后这个行参的话呢,想放一个东西,然后返回是个。对,你也得是一个集合。其实呢,也得是我们同样的这样一个集合,而且放的元素呢,都得一样是吧。才行啊,这个方法呢,一般我们很少掉。啊,咱说一下就过了啊。好,这个就过掉了。然后接着啊这块呢,说跟删除相关的啊CTRLC。哎,我就放到这儿了。哎,往后提一下啊,好,这一波方法。诶,首先呢,我们也是啊,先整这样的一个集合过来。嗯,这个ID我就不要了。像1234个元素啊,第一个呢叫做clear。这叫清空啊。那要清过以后呢,我们要打印一下当年这个集合,是不是里边就没元素了吧。
27:02
来走一下啊。就没有了,所以呢,你要是在调这个size方法的话呢。调这个赛的方法,你说是打印零啊,还是说一个控制帧呢?不是控制针吧?零是吧,哎,不能控制人,因为我这个对象是有的,只是呢,把这里边元素给清空了是吧。哎,注意啊。好,那么这个clear呢?大家能想到它是怎么做的吗?他怎么可的?啊,你看啊,这个呢,A release,咱们刚才也稍微提了一下,它底层其实还是个数组是吧。哎,那这呢,我们就一个两个三个四个,一个两个三个四个,这不是四个元素嘛,但是呢,它只能是放。对象是吧。呢都是object,所以呢,我们这儿呢,放的其实都是地址值吧。哎,就是它指向的实际上就是实打实的你这四个对象是吧。
28:01
哎,这个呢,都是引用类型的嘛,所以他这都是放在地址啊,指的就是实打实你用的这个对象了。好,那我们要是判断size的话呢,就是看你到底侵压了几个,这就是四个了,我要调clear。哎,如果要是你你你怎么去设计这个颗粒。啊,有同学说呢,我直接呢,让这个S呢支成零就行。新造一个空的。那这个成本有点高啊。这道空的成本稍微有点大。哎,我就用它改一改不行吗。可以是吧,哎,所以还用它啊。呃,刚才呢,有同学提到说我就把这个size改成零就得了。有道理不?挺省事的是吧,我就把赛改成零了,这些呢洋这就这些数据呢,我就都不清了。能行吧。不行啊。你看我这时候我再去调方法的时候呢,我们填一个数据,这时候因为S是零了,它其实这块呢,是不是就从S这个位置开始去加是吧。
29:01
哎,去加,然后呢,哎,对它就自动的就覆盖呗。其实挺好是吧。但是呢,这样做会有个问题。那就是内存的泄露。是吧,诶这个方式呢很快,但是呢,你想想啊,这里边儿呢,指向了几个对象,而且这对象呢,有可能它还是个数组,指向的这个数据还挺多,甚至说呢,它即使不是个数独,它是个对象里边有个属性,这个属性呢又指向了一个东西,那整个这块呢,由于你已经不用了。你把它制成零了,我们包括呢,你想拿相应的元素呢,你也拿不到,因为我们即使变利的话呢,也得需要判断这个size。就编了一三个,你这零个相当于一个也拿不到,但是呢,实际上你就不用了。那其实呢,就是内存的泄露呗,是吧。啊,就是我在刚开始学编程,看到这儿的时候呢,我也在想说,诶为什么他就直接整个S等于零多好呢,哎,结果你看源码的时候呢,它其实就是老老实实的。给你一个一个的给你清掉了。
30:03
是吧,一个一个的是不是都给清了。哎,这样的话呢,就没有泄露问题。嗯,体会一下啊好,这个呢叫clear,然后下边这个。对目哎,这个就是把指定的元素呢,给它删掉呗。好,这个CTRLC一下。哎,这样啊,那这块要演示呢,咱们把这个clear呢,得给大家先注释一下啊好,针对于咱们上面的这样的一个C2点,哎,我们做一个叫remove。的话呢,我这要写成是一个P1。啊,P1呢,就我们上面这个了啊,诶删掉以后呢,我们再去打印一下这个C2是不是就没了。走一下。哎,这不就删掉了吗?是吧,好,那这块呢,问题是我不这样写了,我就直接还去一个person。这样的方式。是吧,那你说这块呢,能删掉不。
31:02
啊,这个发现这里边儿咱们讲的还是挺细的哈,坑好多,所以导致大家总觉得每个位置都有坑啊。删掉了哈。诶这个删掉的话呢,你想我们要想删它的话呢,你得确定有有它就删是吧,有的话咱们上面不是也都说过了,它其实调这个是E口的方法吗。啊,第二一个方法咱们也都重写过了呀。所以这块呢,按照这个逻辑标准,我们去判断说有没有的时候呢,肯定有啊,有那块就删了呗。哎,就这个道理啊,好,那再多说一句啊,比如这块呢,我们在。又添加了一个A。啊,因为主要咱这用的是release了哈的话呢,它允许放相同的元素是吧。所以呢,我们要是在这块呢,先去打印一下这个CL呢,实际上呢,实际上呢,是有两个A的。那现在呢,我在这个位置呢。咱们remove一个A是吧,问题就是他能给删几个啊。对,他就删一个。你看上边这块呢,我们这不有俩嘛,然后下边这块你看就留着一个是吧,包括这个我们删person的时候,你看他是不是还要调一库的方法。
32:06
哎,他要判断有没有啊,找到了那我就移除掉啊。所以这块呢木呢,你就记着,一旦找到了,我们就停止了。好,下边这个叫。删除这个集合当中的。所有元素是吧,哎,这个怎么理解呢。比如说调这个方法的,这是一个集合是吧。删除这个集合,这俩集合呢,它不一定是一种包含关系了,一般的话呢,可能是这样一种关系是吧。对这个呢,假设是咱们这个C了,这个行三这块呢,我们放的是C1吧。他呢,调一个他。啊,那结果里边呢。是不是只有这部分了?这个你要移除它的话呢,那就是把它们俩共同有的元素给移除掉,所以呢,就光剩这部分了。哎,这个呢,如果在术业上呢,我们有一个名称。叫做。
33:00
差几?差集,比如这个呢,集合叫A,这个叫B的话呢,就是A插上这个B,得到的就是这一部分。这个你了解一下就行啊。这个我就不演示了啊。好,这个呢叫return啊,Return保留的意思是吧。保留all。这什么意思啊?交集吧。对,当年这是一个集合C,这是C,然后呢,Return就是我呢保留跟你啊有的元素,那其实就是交集的意思。就是取咱俩的交集。啊,对,这个我就也不演示了啊。这个呢,大家你就再造一个,然后一调,诶他呢,就整个呢,对于我们这个当前这个调这个方法的这个集合呢,产生影响了啊,就变化了啊。好这就过了,然后啊,再看一下后边这几个啊。CTRLC。哎,张过来啊。
34:00
好,这个我往这儿放一下,这个呢叫拓瑞。看一下这名儿。这是该啊第四个了啊,先呢整一个集合过来。到这儿啊,CTRLC。好,然后的话呢,诶,我们看到啊,这里边儿呢,叫拓瑞返回值呢,是object类型的数组,其实这个方法的话呢,为代表的,就我们可以说呢,这个集合呢。哎,集合它呢,是不是怎么转化成数组啊。结合呢,就是我们现在讲的这样的一个容器啊,那以前呢,我们讲过数组结合怎么转化成数组呢,哎,这不就提到用这个方法吗。叫to arra啊,所以这块我们拿着这个S2点啊叫torra这块呢,我们一返回,那那这时候这个返回值的话,你想想是不是也只能是拿object类型的数组来装了。因为你添加的时候呢,认为都是object。所以只能用它来装是吧,好,那装完之后的话呢,我们这儿呢,可以去看一看,你这个数组里边这个元素分别都是谁,咱们也讲过一个简便方式,就ari那个叫to string是吧。
35:06
咱把这AR呢往这一扔,哎,这样就可以了啊。走一下。哎,这不就出来了吗?啊,这个呢,是我们集合里数组里边的这样的几个元素。嗯,好了,这个呢,就是这样的一个转换啊,然后呢,如果我们看这个API的话呢,关于这个图瑞的话呢,其实它还有一个叫重载的方法了,但是这个方法呢,它实际上是一个泛型方法,这个咱们还没讲泛型,所以这个方法呢我就不讲了。哎,他就不讲了啊好。这个呢,下边一个呢,叫哈希扣的啊,其实呢,就是计算咱们当前这个集合对象的一个哈希值,这个其实没有太大意义哈。啊,这个咱们后边讲到这个set的时候呢,咱们再把这个哈希库的方法呢,给大家重点的去说一下,诶暂时呢,大家也就看一眼就行啊,通过它呢,我们调一下哈库,就算一个哈希值。啊,就这样个数啊就完了啊,这个先不用管它的实际意义啊,好,然后下边这个呢,叫。
36:04
这呢是一个方法啊,它呢是用来便利集合元素的,咱们专门到这个位置的时候呢再说。啊,所以呢,把这个呢,我们先过掉它,然后刚才这个图瑞的话呢,我们又看到这里边有一个重载的方法,哎,这块呢,我们一写,那这到14的,再加上刚才重载的方法,一共呢,不就是15个吗。啊,这就我们关于collection呢,要讲的这15个方法。啊,十个方法,好,回过来咱们做一个小结啊。那刚才呢,讲了咱算14个方法吧,十四十四个里边呢,推还没讲是吧,这些方法呢,回顾一下能记住不。哎,咱们写一写啊,大家不用记,哎,你稍微有个印象啊。哎,首先叫爱的是吧。添加一个元素。可以艾特all。把另外一个集合中的元素呢,都加过来。是吧,还有呢。
37:02
啊。啊,先想到克雷尔大星。还有,那叫is。Empty是吧,说是不是空的。啊,Size刚才不是也提到了。是吧,然后呢,咱们先说这个contains吧。诶,Contains是不是包含啊另外一个元素。还有,那叫contains all。哎,是不是包含另外一个集合当中的所有元素。还有呢,这个叫求交集吧。Return。哦,是吧。取两个集合的交集,还有呢,叫取这个。差级,差级叫瑞木,瑞木的话我们还可以呢,先remove一个元素。哎,还可呢,叫。哦,是吧。哎,把另外一个集合中的元素呢,都给它移除掉。啊,还有刚才提到一个叫哈希扣的一个方法。还提到有一个equals方法是吧,哎,这个刚才也提到了这几个了。
38:03
一二三四五六七八九十十一十二是吧,然后我们刚才提到了,是不是有个吐的方法。啊,然后呢,它有俩是吧,那个就没讲了,这个十三十四了,然后还有一个我们没有讲的一的方法。诶这呢,一共就构成了15个方法,这里边儿还有一个把它给略掉了是吧?行,整个呢,就是我们collection里边定义的方法,诶大家呢,能够有一个印象啊。OK,那么这里边呢,我们提到了有一个方法呢,叫图尔瑞啊,然后把它呢,我们专门的稍微的说一下啊,这里边儿就涉及到了集合和数组之间的一个转换。那么刚才我们讲的这个方法呢,相当于是把这个集合呢,转换成是一个数组。这块咱们用的是叫tor啊这个方法。反位值呢,是一个object类型的一个数组了,那么我们可能就会想说,那数组的话呢,能不能转化成集合呢?也可以哈。
39:00
那数组如何转化成集合呢?哎,这块呢,咱们作为一个补充内容呢,提前呢把它呢说一下。好,回到这个代码层面。再去新建一个。啊,这个我们写成个五啊,那首先的话,你得有一个数组啊,这个数组这块呢,我们有一个工具类呢叫嘛,它呢有一个方法呢,叫做as list。这个呢,你看它这个形参是不是一个可变型参啊。那其实呢,你就可以放个数组吧。哎,可现在咱们这块呢,是不是支持呢,是你放数组对吧。比如这块呢,我就是个死类型的。哎,你有一个哎词类类型的一个数组。这位置我们就来几个,比如AA。BB是吧?CC是吧,好这呢,我就有个数组了,我把这A2呢,是不是就放进来。放进来以后,这时候呢,他就给我们返回了一个集合了。那反过力及格长什么样呢?我自动让它生成啊,Alt加回车,你看生成的就是长这个样子了。这个呢,没见过,先把它删掉。
40:01
这块的话呢,你看是一个list了,那list呢,是我们collection的一个子接口嘛,是吧,那自然而然呢,它是不是也就是一个了。啊,这个你愿意改成collection,你就改,不改呢也没关系啊,在这呢,我们就转化成一个collection了,这里边儿你也可以去打印一下我们这个list。哎,走起。那你看没问题。啊,这是OK的啊行,这个呢,就是我们把这个数组呢,转化成集合的这个方式啊回过来啊,在这说一下怎么转呢,我们是调用。哎,调用我们叫哎array。是啊,它的一个静态方法。这个静态方法呢,叫做as list是吧,里边呢,它写的这个T哈,其实你可以理解成了就是object了。哎,然后呢,多个哎数组的元素。啊,就是这个位置呢,你写一个数组可以了,或者说我不写个数组,我就直接放这几个abcd啊,是不是也可以。就是这样啊,我们通过这个A,咱们再重新来一下啊,第2AS least这个我就直接写A。
41:06
是吧,BB。CCD是不是都可以啊?哎,这样,这不也行吗。哎,这是LIA1这个没见过,咱们就先给他先删掉是吧。哎,这样呢,你看也OK的啊。一样是吧?啊,没问题啊行,这块的话呢,可能会有一个小细节啊,大家在处理的时候呢,可能容易出错哈,你看我现在来做这样一道题,其实这块呢,也算是一个笔试题了。哎,你看这块你容易是不是容易出错啊,我现在呢,是写成叫inte类型的一个数组是吧,然后叫AR了,然后右边呢,我叫这样一个数组,这里边的话呢,我就写成一二。哎,不报错,是不是自动装箱了。好的,然后呢,接下来我呢,就调这个ari,它有一个叫as list,我把这AR呢,我就扔进去了。
42:01
然后此时呢,它返回的咱们也知道了,实际上是一个例子了是吧。啊,当然这个你写成collection也行啊,好,那么此时的话呢,它让你打一下这个list1.size。问,有几个元素?这不就仨吗?啊,有时候是一个的啊,行先别着急,然后呢,这是一个场景,然后现在的话呢,我把这个呢,我改成了叫int类型的数组了。然后这个呢,叫A21吧。啊,这个我们也可以呢,就这样吧,啊这个呢叫绿一是吧。好,然后呢,把这个A21呢,我扔进去。返回一个叫利一,问他的size是几?先说这个吧。这几个。这是一个。可以说三个的吗?一个一次。一个两次。一个三四好一一个是吧,这个呢。这啊,也说一个的。有说三个的是吧。
43:02
这个。哪个可能性大?三的可能性大呀。一的可能性大。这就有点儿郁闷了,就啊。跟大家呢,说的可能正好相反是吧。这个说一的多,这个说三的多。说反了哈。哎,我郁闷了。这个是其实这个题我要不讲的话呢,大家其实是可以判别出来的,杨丽呢,就是这个咱们已经讲过的知识,这不是新知识啊。为啥是三呢?咱们说了啊数组,哎,这是我们叫,哎刚才提到这块呢,是不是叫可变形态,诶在这儿是吧。可变个数的形态的方法啊,他在我们调的时候呢,实际上你可以一个数组的方式呢,去调它是吧。那数组的话呢,我们原来调啊,你就相当于放个数组,现在呢,他认为你放的其实就可以看到是数组的元素嘛。所以这块呢,这个相当于你就放了一个123,就这块儿呢,跟你写上这个123实际上是类似的啊,只不过这块呢,我写的就是A2了。
44:08
所以呢,这块是有仨。因为呢,这不就是三个对象吗?啊,那这个为什么是一呢。说明他把这个整个呢,看成一个整体了。因为你这个里边啊,我们as的意思呢,咱们看这是不是它只能放对象。它不能放基本数据类型。所以说呢,你回过来以后呢,这个位置你说我放的是123不行,你这个123呢,就是基本数据类型的这个123。我不能让你装这个数的。你说上面为什么能装,上面你要装的时候呢,实际上你是看成自动装箱以后的了。对吧,啊,你这边呢,要放的话呢,你只能是整个呢,这个数组可以看成是一个对象装进来可以,所以呢,你就放了一个元素。所以这个是一。也就是上边这个呢,我们打印一下这个例子,跟你下边这个。哎,我们打开这个例子一看,一看这个情况啊。
45:03
下边这个话呢,它就有仨元素,下边这块呢,你就一个元素,就是你这个元素。哎,就是你这个int类型的一位数组。这个注意一下。请大家写的时候呢,你小心一点啊,就是怕大家用的时候呢,你用错了,你想放仨元素,结果呢,其实就一个啊。好,最后这块,哎,我们说这块总结一下啊,在刚才这些方法里边呢,我们看到哎,咱们去放了一个person的对象,在有一些方法调用的时候呢,我们发现呢,其实它要调person里边的E方法是吧。比如说你这个是不是包含呀,哎,移除的时候啊是吧,像这呢都要用啊,所以这块我们想啊,说一个要求啊,像collection中添加元素的要求,我们说呢。要求元素。啊,所属的类。是不是一定要?重写以后的方法呀。这是我们的一个要求。
46:00
啊,因为呢,我们发现呢,他在调这个方法,或者调这个方法的时候呢,他肯定要调你这个obg这个元素所属类的一口方法了,那你要不充写不充写,它要是用的是object当中等等,不太合适哈,既然他调ES了,实际上呢,就希望呢比的是内容,所以我们一定要重写啊原因呢,就刚才说的啊说呢,呃,因为。啊,Collection中的。这个相关方法在使用时。哎,要调用,哎咱们这个元素。啊,这个所在类的。啊,E的方法。哎,就这个原因啊,那在使用相关方法这块,我们说呢,诶比如说诶刚才说的这个叫诶cons是吧。啊,或者呢,这叫remove。是吧,哎,等这样方法的时候呢,他要用,所以呢,我们就要重写啊,记住这个事儿就行了。好,那这儿呢,咱们把这个collection collection里边这个方法呢,咱们就测了一遍啊,大家能够有个印象,自己呢下来呢也稍微再测一测就可以了,好,那咱们呢,是提到这个collection里边的常用方法了,呃,其中呢,还有一个方法呢,叫做,然后这个方法呢,咱们现在呢,说一下这个方法呢,它对应的是什么呢?就是我们集合呢,是存储的多个数据啊,那么多个数据的话呢,我们可以进行一个便利的操作,那如果要是便利集合中的数据,我们使用的呢,叫迭代器。
47:21
那集合跟迭代器中间的一个跨度啊,一个连接的桥梁,实际上呢,就是我们这个方法了。OK,所以这块我们来说一下这个迭代器的问题啊,首先呢,涉及到一个迭代器啊,这个迭代器呢,是我们汉语里边一个词了,对应的英文呢,就叫做ter了啊,然后它的一个作用是什么呢?刚才我们其实也提到了,就是用来便利集合元素的。啊,这呢,就是我们这个迭代器的一个作用,所以这里边儿呢,大家要区分出来迭代器和我们现在要讲的这个集合框架,它们之间的一个关系啊。这个集合呢,咱们说是一个容器。它呢,是用来存储数据的。啊,这个迭代器呢,注意它不是容器,它不能来存数据啊,它只是用来便利啊这样一个现成的容器当中的数据的。
48:08
啊,所以呢,这个我们叫迭代器了,这个对应的其实也是一个迭代器的这个设计模式,诶当然呢,如果去23种设计模式里边去找,会能找到这个迭代器的这种设计模式的啊好这呢咱们就不说了。啊,那如何呢,去使用这个迭达器来便利集合元素呢?啊下边我们就来说一下了,好,那么这块呢,我们首先呢,去创建一个。啊叫。哎,它的一个测试。OK啊,过来首先的话呢,我们来一个单元测试方法。诶,那要想便利啊,集合首先呢,我们得有一个集合,然后呢,相应的我们也放一些元素,哎不妨呢,我们这块呢,就拿过来一个啊CTRLC。好,这呢我们就放到这儿了,那下边的话呢,我们就要便利这个集合当中的元素了,使用的呢就叫做迭代器,呃,那如何获取迭代器的对象呢?迭代器。
49:02
诶,对象是吧,刚才我们提到了啊,拿着这个啊集合我们去调用这样一个方法,这个方法名呢,你看跟我们说的这个迭代器呢,其实是有点儿像的哈。哎,这个你把这个I呢,改成个大写的,其实就是我们叫迭代器的一个词了,然后在这个位置呢,我们al加个回车,直接呢,就返回了一个迭代器的一个对象。啊,那这个迭代器呢,我们按住CTRL键一点,这块呢,其实也是一个接口。啊,那么很显然呢,这里边儿呢,使用了多肽。那也就是说我们通过这个CR呢,去调这个方法的时候呢,返回的是一个迭代器接口的实现类的对象。那至于有同学说,诶说这个迭代器它的这个时间类到底是谁啊,其实我们不用关心哈,诶如果你要特别感兴趣的话呢,你也只需要呢,第一下我们这个对象呢,它有个方法叫get class就可以了,是吧。呃,这块呢,大家完全不用关心它的这个实现类到底是谁啊,你只需要知道是它这个迭代器接口的实现类的对象就行了。好,那么有了这个迭代器的对象以后呢?下边我们该如何去便利集合中的元素呢?这块我们可以看一下API了。
50:02
好进来进来以后呢,在这个接口里边呢,它提供了几个方法,其中呢,有一个方法呢,叫做next方法。这个呢,就是取它的下一个值的意思啊,The next element是吧,在你整个这个迭代器的这样一个队列当中哈,那我们每调一个方法就能返回一个值啊,在这儿你看到是个E是因为呢,它在生明的时候呢,还是带这个泛型结构了啊,那目前呢,大家都忽略这个泛型的结构,你看到这个E的地方呢,都理解成是object就可以了。啊,也就是说,那我们回过来拿到这个迭代器对象以后呢,我们就想去调它的这个next方法。啊,一调这个方法呢,就能够获取我们这个容器当中的一个对象了。啊,那这里边儿呢,自然而然的其实就能拿到第一个元素。那咱们这儿呢,一共是12345个是吧,诶那就意味着我这块呢,是不是可以调五次啊,直接呢,把当前这个next调完以后呢,就打印了,一共呢是来五次。
51:00
诶没问题,好,那么这时候呢,我们去做一个执行。好大家看啊,这时候呢,确实呢,我们把这里边儿的12345,哎,这个五个元素呢,我们就都获取到了这儿呢,其实就属于便利操作了,那一共呢是有五个元素,那如果我们现在呢,再去执行一次。啊,第六次,那这时候会出现什么问题吗。对,运行一下啊,确实呢,你看出错了。这就输入在这个信息呢,叫no such element exception。对,没有这个元素的一个异常啊,确实咱们呢,一共也就五个元素是吧,哎,这个我们当再去调net方法的时候呢,就会抛这样的一个异常。啊说呢,诶如果超出了。啊,集合中啊,元素的这个个数。哎,这个我们说呢会报,哎,刚才看到这样的一个异常信息。行,那就意味着这个呢,肯定是不能调了,那IG呢,就是我们有几个元素,你就只能调几次这个方法了,那这块就涉及到呢,我们这样写显然呢是不靠谱的啊,我们肯定是要用一个循环来做了。
52:06
啊,这个呢,我们算成叫方式一。啊,这呢也就做一个参考就得了啊,那这时候我们要考虑使用一个循环来去处理。哎,这个方式二啊,那循环呢,我们用for循环还是用Y循环呢。啊,这块要考虑呢,你看一共呢是五次,这个五次呢,是因为我们整个这个集合的元素的个数是五个是吧,对于这种次数比较清晰的呢,可能首先呢,我们考虑的就是写了一个for了是吧,比如说in那个I呢等于个零,I呢就小于,哎,咱们提到一个方法叫size嘛。对吧,哎,然后A呢去加加一下这呢就让它循环五次,然后呢,我们就调五次这个net方法呢就可以了。哎,就这样写是吧,好,那这是我们再去做一个运行。也没问题啊,哎,这样写的话呢,可以,哎,但是的话呢,我们说呢,实际当中啊,咱们也不会这样去写。哎,这已经挺好了,为啥不这样写呢?
53:01
哎,主要原因呢,就是因为他还给我们提供了另外一个方法,哎,这个方法呢,叫has next,所以通常呢,我们会这两个方法搭配着去使用。啊,其实按说呢,这种方式就说写行嘛,也可以的哈,呃,只是说呢,因为有另外一个方法的存在,所以我们习惯呢,就用另外一种方式了,呃,这种就不写了啊另外这种方式怎么写呢?首先呢,刚才提到了,我们通过这个ter调这个has next来判断呢,它是不是还有下个元素。那你要有,那咱们就调next,如果没有,那就不用再调用了。所以呢,他这呢是一个布尔类型的,哎,咱们就方便呢,去把它放在一个while里边了。是吧,诶has next呢,这是返回的是个word类型嘛。诶,如果你要是有,那我们就在这里边儿呢,去调用一下。诶,就成这样了。所以这个呢,是咱们习惯上呢,呃,用迭代器的时候呢,使用这个方式。那你说这样写行不行呢?当然没问题,但是呢,这样写呢,容易被人鄙视是吧?啊,就这样的话呢,是比较正统的一种写法。
54:01
好,这个写完以后呢,我们也是同样的做一个执行。哎,这样出来了。所以呢,这块我们该如何呢,去便利呢,诶这块呢,就提到了这样的一个操作啊回过来。啊,首先这块呢是如何便利了啊,那这个呢,我们往前提啊,这块呢,说如何获取迭代器的对象啊,就咱们上面的这样一行代码。这样呢就可以了。好,那这里边儿呢,针对于这个操作呢,我们需要呢,去做一个分析哈,怎么去理解这个事儿,哎这儿呢,我们来看一看这个课件啊。在这里边我们找到这个迭代器啊,这个接口,然后看下它的这个执行原理,OK,这儿呢,我们比如说集合当中呢,放了这样的几个元素,我这儿一共是放了有六个元素,首先的话呢,我们通过这个啊集合呢去调这个这个方法返回一个迭代器的对象了,然后呢,我们这儿呢,是调了一个叫has next。呃调那之前呢,首先我们这个迭代器对象获取以后呢,诶大家呢,先有一个直观的一个理解,这儿呢,如果看成是我们这个集合的话呢,这时候这个指针也就是我们这个ter呢,你假想它有个指针,这个指针呢是指向第一个元素的上面。
55:06
啊,第一个元素的上面好,然后呢,当我们去调这个next的时候呢,他会判断一下啊,你可以理解成呢,就是你现在就是一个小人是吧,你就站在这儿啊然后呢,问是不是has next,那就往下望一下。哎,看一看下个位置呢,有没有元素,因为你一开始在第一个元素的上面嘛,所以往下望的话呢,就望到第一个元素了,你看诶有啊,那要有元素的话呢,这个方法就会返回一个处。法位处以后,呃,然后呢,我们在这个方法体里边呢,呃,循环体里边呢,就调这个nice方法了。一定要这个方法呢,这个方法有两个作用,第一个呢叫指针下移。啊,第二个呢,叫将下移以后,集合位置上的元素呢返回。所以呢,我们调ne方法的时候呢,指针下移过来,这是第一步啊,第二步把这个位置上的这个值呢返回了,返回以后呢,我们这打印了,所以呢,123啊这就出去了。
56:00
然后呢,你站在这个位置呢,接着往下看,是不是我们就回到这儿了啊has next一看,诶还有还有呢,我们就再去调这个next方法,指针再下移,再返回,返回完以后呢,这时候你指针还在这儿,再调high ne,再往下看一眼,还有,然后呢,诶,这时候调ne方法再下移啊,再返回,以此类推啊,现在呢,我们已经把最后这个元素呢已经输出了啊,这时候你还站在这儿。站在这儿呢,我们再往下望一下,相当于你调一下has next一看没有了,哎,这时候呢,返回的就是false,哎,所以呢,这个循环呢,就退出了。言之呢,就我们不会再去调nice方法了。啊,也就避免了我们刚才说的叫no such element的出现。哎,整个呢,就是这样的一个过程啊,大家呢,稍微的熟悉一下就可以了,那么回过来这里边儿呢,我们比较感兴趣或者要关心的呢,就是这里边这个next方法,哎,大家呢,需要去诶注意一下啊,它呢有两个作用,刚才提到了。就一旦执行,首先呢叫指针下移。
57:01
哎,这呢是第一个操作,然后第二层呢,就是将诶下移以后啊,这个集合位置上的元素返回。啊,加一以后集合位置上的元素呢,返回。OK啊,这呢就是它的一个作用啊,那么通过这样的一个方法搭配的使用,咱们呢就能够实现集合的一个便利了,哎,就这样去写,其实呢比较简单啊,这儿呢是我们的推荐写法。啊,完事了啊行,那这个写完以后的话呢,我们接着呢,再给大家写一个例子,大家看这个写法呢,可不可以啊怎么做呢,诶我呢把这个事儿呢,首先还拿过来CTRLC。诶拿过来了啊好,拿过来以后的话呢,诶这时候呢,我们首先还是通过这个啊集合调这个这个方法先获取一个迭代器的对象。哎,拿到了啊,拿到以后的话呢,刚才我们提到如何去便利了,可能有同学会想说,诶诶,我不用这个head ne呢,好像也能实现便利。
58:03
他怎么写呢,这样写大家你看有没有道理啊。他呢,还是用的这个。啊,然后呢,在这里边呢,怎么处理呢,这样啊,哎这呢,用这个ER点,哎直接呢调这个next方法说判断一下这个值呢,看它是不是no。如果要不是no呢,那我就把这个nice这个值呢,给它做一个输出,说呢这也行。啊,大家看看这种方式靠不靠谱儿。这样行不行?不行啊。这个呢,来咱们运行一把看看。哎,确实呢,有问题是吧。确实有问题的话呢,我们看一下它这个结果是一个什么样的一个执行情况啊,你看。呃,这个呢,可能不明显,这叫A了,我这样换一下啊,这个咱们改成叫BB吧。这样啊,你看一上来呢,这块就输输出的叫BB。
59:02
然后呢,这块呢,这个person呢,没输出出来个128。然后报错了就。看能理解这个事儿吧。第一个为啥没输出呢?哎,对的啊,第一个的话呢,相当于他一上来呢,调net方法这块,其实返回的就是AA了是吧,说AA呢,是不是闹闹不是闹。然后呢,接着调next,是不是指针就下移了。对,所以把BB呢就给输出了。APP输出完以后呢,然后接着又掉呢。判断是不是no,不是no,但是你也没有输出person,直接又掉了,把128给输出了是吧。诶然后呢,接着你再去调next的时候呢,诶把这个商务呢,就返回了,返回以后呢,是不是闹了不是no,再调再调是不是就出我们这样一个异常了。所以说这个事儿呢,这种写法不靠谱儿。啊,哎,这个写法不靠谱,好,这呢是我们说的第一种方式啊。
60:02
诶,方式一这个我们是错误的便利。啊行,这个呢大家注意一下,然后接着的话呢,哎,可能还有同学呢会这样想啊,上面正确的写法呢,是先获取一个迭代器的对象,然后拿着这对象呢去调。啊,就咱们刚才提到的是不是正确的这种写法,哎,我把它呢再粘一下啊。这是迭代器的对象,然后呢,这呢是我们的一个便利的行为,哎,这样子的。然后呢,他考虑这样写怎么着啊,说呢这儿呢,是我们返回了一个对象,这个对象呢有名,说干脆呢,我就不想用这个名了,诶我直接呢就用匿名方式得了。把这个呢,就直接干掉啊。这样行不行?匿名是吧。对,这个呢,相当于调用完以后呢,返回一个迭代器的对象是吧?哎,是不是有下个元素有有就进去了,进去以后呢。
61:02
哎,又返回了一个对象,然后调X方法。这样的话会输入会出现什么样的效果呢。啊,一直是。A了。哎,你看。出不来了。那就这样的情况来,咱们把它呢主动给停掉啊,这个原因呢。哎,其实我们,哎,刚才有同学也说对了哈,就是当我们调这个方法的时候。这没诶。刚才没停掉。啊,他这块呢,其实就我们又呈现一下是吧。这样就看不见了。行,哎,就是当我们调这个方法的时候呢,它返回一个迭代器的对象。它这个指针的话呢,是不是在第一个元素的上面是吧。嗯,那当我们要再调这个这个方法。再调这个方法的时候呢,它相当于就是即使呢,你这块呢,调过这个net方法,这个指针呢,已经是调到这个位置了,但是呢,你下一次的时候根本就没有用这个对象,是不是又重新的又调了一个方法,又返回了一个新的迭代对象。
62:04
所以这时候这个指针呢,还是在一开始的一个位置。导致呢,就是我们每次呢,都是新造一个替代器的对象,都取它的第一个元素了。每次都这样,所以呢这块呢就出问题了。啊,这个是不对的,所以呢,应该怎么做呢?应该是你拿着诶产生的这唯一的这个迭代器的对象,然后让他呢,这个对象依次呢,指针往下移,而不是每次都返回一个迭代器的对象了。啊,这呢就是这个问题的一个错误点。啊,这个呢,是我们这个比如方式二吧,这呢也是一个错误的便利,哎,通过这个呢,我们想说明的就是每次。诶调用啊,咱们这个叫这个方法说呢,都会返回。一个新的啊迭代器对象。啊,那既然呢,你是一个新的迭代器的对象,那么它这个指针的话呢,自然而然也就只在呢,你这一组数据的啊头部。啊,所以每次调的话呢,都是一个新的这个A出现了啊,所以这呢也是一个错误的情况。
63:05
好,那总之啊,大家呢,记住我们正确的写法呢,就是哎,先获取一个对象,然后拿着唯一的这个对象呢,去调这个方法就可以了,这样呢去做好,这呢就是我们这个迭代器的一个使用啊。好,那么迭代性呢,说完以后呢,我们下边呢,给大家再讲一个补充的知识啊,这个呢是在5.0当中的一个新特性,这个呢我们可以呢叫做增强后循环,也可以称为呢叫for each循环,哎说的呢都是它,哎我们在之前讲循环结构的时候呢,提到过JA亚中呢给我们提供了比如叫for循环,哎外号循环。是吧,哎,Do y循环这样的几个结构啊,那么在5.0的时候呢,其实呢,有一个呢,叫增加for循环,跟这个for呢结构有点像啊,但是呢,整个写的形式呢,还不太一样啊,这呢就是我们要说的叫增强后循环,首先的话呢,这里边提到说你这个循环它的一个作用是什么。主要的这个作用呢,就是用来诶便利的,便利啥呢。
64:00
哎,前面我们讲过数组它呢可以用来变离数组,也可以用来便利集合。所以呢,这就是它的一个作用,好,那下边就涉及到,诶这个格式呢,长什么样子是吧,那咱们这块呢,就可以写具体的代码呢,通过这个代码呢,咱们去做这个说明啊,这呢关于for啊,你可以写叫for each for都可以啊。好,进来这块我们写一个单元测试。那首先的话呢,我们考虑一下用它呢,去便利一下我们这个集合元素啊,我们从这到这儿,再把这个集合和它的一个元素呢拿过来。哎,就这样了啊。行,那么接着的话呢,我们想便利这样一个集合,除了用迭代器之外呢,还可以使用,我们现在叫增强for循环,这样去写啊,首先呢,写个for。然后这个for里边呢,有这样几个部分啊,这个首先呢,指明一下我们这个集合当中元素的类型。注意是元素的类型,咱们添加的话呢,都是object是吧,所以这块呢,是不是就是object了。OK,然后空格一下,接着的话呢,起一个变量名。
65:00
这个呢算是个叫临时变量了啊,比如我就叫OB接了,哎,冒号一下,后边这块呢,指明你要便利的是一个什么样的容器啊,咱这块要便利的是这个CU是吧。哎,就这样。哎,这就可以了,再说一遍啊,这个呢,是我们要便利的这个容器对应的这样一个,哎,对象名那就是C,然后呢,它内部的元素的类型写到这儿。这块呢,就临时起个名。这个名的意义是什么呢?是这样的啊,我们呢,从这个容器里边呢,依次呢去取数据,那第一个要取的就是A了。把取掉的A呢付给obj。诶,大家注意我说这样一个过程,因为呢,一会儿有相应的一些笔试题。啊,就来考察这里边这样一个原理的啊,诶我把取到这个元素呢,付给这个obj,然后呢,下边你看你想针对obj做什么样的处理,咱们呢,只想做个便利嘛。那我就把这obg呢给打印了,打印完以后的话呢,它会继续的从啊col这样一个集合当中再取一个元素,再把它付给obj,那我们就这块儿再又打印了。
66:05
然后呢,你再取一个啊,这就把这个P1呢给取到了,然后再打印,以此类推,直到呢,你取到最后一个的时候呢,我们付给obg打印了再去取,没有了,它自动的就结束了。啊,那里边儿我们看到这个细节呢,其实上都已经做了一个封装了。啊,你注意我刚才提到一个点,是把这里边儿取一个元素付给他,然后他呢,我们给打印的。OK啊好,那首先呢,我们来看一看它的一个执行的效果。没问题。啊,这个呢,可以实现我们这个集合的一个便利啊,这是OK的行,那除了能够便利集合之外呢,它也可以用来便利我们说的这个数组啊,这块咱们也写一个例子啊。数组化呢,这个就比较多样了,比如我们是基本数据类型的,这呢都没有问题。啊,在这里边儿,比如说哎,我们写这样的几个数。哎,好了,然后呢,下边呢,我们使用这个增强for循环,看一下如何去便利啊,For怎么写。哎,是不是就int呀,哎冒号一下A了。
67:02
对啊,这个呢,就是你要便利的这个容器的这个对象名,然后呢,元素的类型int啊,起一个临时的变量是吧。哎,打印一下这个I,这不就可以了吗?哎,走起。啊,没问题是吧。好,然后呢,我们再再便利一个吧。嗯,来一个三是吧。来一个死砖类型的。哎,这么着。哎,这样是吧,来一个这个。哥哥。姐姐。啊,弟弟。啊,这个妹妹是吧。这啥呀?嫂嫂是吧啊。行,那就这样写吧,啊,然后呢,接着是吧,锌呢是元素的类型。String是吧啊,起个变量名,然后A是吧,哎,这就可以了啊。
68:03
诶,这样啊,然后打印一下这个S。哎,比较简单啊,来,走起。这就出来了。啊哎,别光光看嫂嫂呢是吧?诶这个回馈便利啊好这就完事了啊回来说一下这个格式长什么样呢?诶一个for循环,一个小框一个大框,诶从这个上面来讲呢,跟咱们原来的样式呢差不多。这个呢,是我们,哎要。哎,便利的集合或。呃,数组元素的。类型。然后这样啊,然后空格一下,这个呢,就是一个临时变量。或者你要一个局部变量啊都行啊。哎,然后呢,接着是一个冒号,然后后边呢,就是要练力的。呃,集合。诶或数组啊,这样的一个变量是吧,诶放在这儿或者叫引用啊都可以啊行,然后里边的话,你可以针对我们这个临时变量的话呢,你去做一个操作啊。
69:00
啊,临时变量的一个,哎,输出,哎这就可以了,像这呢,就我们说的这样的一个格式。啊,OK,行,这块呢,大家注意一下我们这个for循环,然后这块呢,关于它的一个说明,诶可能有同学就想说,为什么我们讲这个新特性跑到这块才讲是吧?说呢完全可以放在我们一开始讲这个流程控制的时候去讲,为啥放在这儿呢?那我们可以稍微看一下啊,针对于咱们刚才呢,演示的这样的一个集合,这块呢是一个增加for循环,我在这儿呢,打一个断点。来我们呢,使用一个debug啊,咱们看它底层它会掉水。啊,这时候呢,光标呢,已经跑到这儿来了,然后现在呢,我点一下这个源码实现一点。诶,你会发现呢,此时呢,是不是就跑到我们这个迭代器这块了。啊,我们调用了这个release呢,这里边儿叫这个方法,然后里边呢,去new了一个,哎,当前这样的一个类的对象,实际上呢,咱们刚才说呢,大家不用关心它的返回值是哪个类型的,只需要知道是迭代器的实现类的对象就行,实际上呢,那个哪个类的呀,就是这个类的对象。
70:02
哎,说白了啊,就是咱们其实这块就已经可以了啊,哎,也就是说呢,咱们使用这个集合,哎,然后呢,对应的这个增强for循环的时候呢,其实它底层使用的还是迭代器。对,只不过呢,我们封装出来以后呢,就是这样的一个简洁的格式。啊,这块大家稍微的关注一下啊,所以我们在这儿可以写个对应的说明诶。这个针对于咱们说的这个集合来讲。啊,然后呢,呃,增强for循环。诶,它的这个底层啊,仍然使用的是。哎,使用的是啊。这个迭代器。OK,这个呢,就是我们要说的第一个问题啊,然后第二个问题呢,要说明什么呢?这个格式呢,你看呢是这样写的,大家一般用的话呢,也不会出现什么问题,关键呢,就是说我们得到这个临时变量以后,对这个临时变量呢,如果你要是输出没啥问题,你要是对它这个值进行修改。
71:01
这个时候呢,可能就要小心一点了。来这块我们就可以看这样的一个题目。啊,这呢是一个笔试题了,好,大家看啊。这个题面呢是这样子的,我这呢有一个哎,四针形的一个数组里边呢是AACED。然后呢,通过这样的一种方式,这呢,就咱们前面讲的第一种循环的方式。诶,Ari啊,找到这里边的每一个元素,改成了美眉了。改完以后的话呢,我们去遍历一下。这个我用的是增加负循环,问此时呢,打印出来的是上面这个还是三个美眉呢?三个美眉了是吧?走起确实如此是吧,好,这呢是第一种复制方式,把这个注掉以后呢,我们改成这个方式了。改成这个增强for循环了。那么这个时候呢,我要是再去做便利,结果是啥呀?哎,是不是这时候呢,没有改成是吧。
72:00
这个呢,你得理解为什么。这个呢,其实跟string呢。没关系是吧,嗯,这块如果我们要基本数据类型没有影响,如果要换成不是这个string类型的,是一个比如person类型的一样,是吧。一样啊,因为呢,你取出这里边一个元素呢,其实是给他的一个地址,把地址给了这个S了是吧,然后这个S的话呢,你如果拿着它的地址去改,那这就相当于你这个person是不是又重新又new了一个person对象。对,然后呢,我们本身的这个,呃,位置上的这个元素,它其实没有变是吧。嗯,OK啊,所以说这块呢,你一定要小心,如果呢,我们使用这种增强for循环的方式,然后在这个里边呢,你想去修改这个元素的一些信息,注意这个修改呢,是不成功的哈。啊而呢,我们要用原来的这种方循环的方式呢,它相当于还是指的是你数组里边那个元素。如果我们要简单画一下这内存结构图的话呢,其实是这样子的哈,这个呢叫A221了是吧,然后这块呢,指向了哎,我们对空间里边这样的一个数组。
73:02
啊,我们这块呢,叫A啊叫这个CC。啊,叫这个DD。然后呢,第一种方式呢,相当于我们直接呢,就找到这里边儿的这个位置,然后呢,你把这个位置呢,改成这个啊美眉了是吧,依次呢,这样去改它实打实操作呢,就是我们这个数组的这个索引的位置元素了。而这个增强for循环呢,是你把原来的这个位置上这个值,它可能是个地址是吧,指向是个对象,把这个地址呢,赋给一个新的变量了,是新的这个变量了,默认的指向你,那你要是把这个S呢,又指向个新的对象了,跟这一点关系都没有。哎,就是这样的一个原理啊行,那么回过来呢,这块我们需要强调的点。我们在这儿稍微再说一下啊。说呢,这个增强for循环。啊,它呢,是将。啊,在这个执行过程中是吧。哎,是将哎这个集合或。哎,数组中的这个元素啊,依次赋值给咱们上面提到这样的一个叫临时变量啊。
74:07
啊,临时变量,哎,所以呢,这块要注意。啊,这个循环体中。哎,对这个临时变量的这个修改啊,可能。啊,不会导致。啊,原有。呃,集合或数组中啊元素的一个修改,所以这块呢,大家一定要小心啊,你看这块我写的时候呢,可能是吧。那就意味着也有可能会改是吧。会改什么场景呢?比如我们还拿这个例子来说啊,这块呢,假设我们这个就是person类型的了,哎,多个对象啊是吧?哎,这块我们指向一个person的一个数组里边呢,有好几个人的这个对象了,然后呢,你现在把这个啊,这个地址指向一个实打实的个对象了,然后你把这个地址呢,付给我们这个临时变量,假设也叫S是吧,然后这块他不就指向他了吗。如果你让这S呢重新指向一个新的person,对他呢是没有影响的。
75:02
那你说我拿这个S呢,我去改这个里边这个属性了。你是不是就会把这个属性给改掉啊。对,那这块你要在这块去看,他也是能改的是吧。诶这块呢,注意一点啊,就是具体问题呢,还得具体分析一下啊,总之的话呢,跟我们原有的这个一般的for循环呢,就不太一样了。这呢是我们说的这个增强for循环,哎,这呢我们就说完了。
我来说两句