00:00
大家好,我是海波老师,我们继续来讲Java中的集合,那之前啊,咱们说过了,Java中的list接口有两个常用的集合类,一个呢,就是我们之前刚刚讲的list,那还有一个呢,我们称之为叫link的list,所以啊,我们这里来拷贝一下,我们写上它,咱们叫零五。然后呢,把这个去掉啊,咱们叫link的list点击OK,行了,把里面的东西咱们全去掉了啊,全给它去掉。去掉了以后,这个我们改一下咱们叫link的啊list,接下来咱们就准备来讲一讲这个集合,首先还是从名字上咱们分析一下我们的link list呀,它里面包含了一个叫link,再加上一个list,那不用说了,我们的list说明它跟这个接口有关系,那么这个link什么意思啊,这个link呢,它就表示的是将物体连接起来的意思,所以啊,这里面有一个动词的感觉,咱们叫连接啊,把它连接在一起的感觉啊,它描述的也是一个数据存储和管理的一种方式,把两个单词合在一起以后,那么这个link的list啊,它就是表示将存储的数据连接在一起的意思,不太好理解吧,所以我们也是通过画图的方式来给大家解释一下,所以我们往下。
01:14
往下以后呢,我们这里还是先画一个小方框啊,来表示一个集合对象,所以呢,放过来,放过来以后,我们这边给它放过来啊,然后呢,我们加点文字复制一下,复制以后我们放到这边,然后呢,把这个颜色呢变成蓝色。行了,这边我就写上它,它就是我们的一个link的啊list,诶老师呀,那么怎么理解那个链接的感觉呢?其实谁啊,你想想我要把它链接在一起的话,我是不是得有个什么小钩子之类的东西,对不对,所以啊,我们的link list里面它会有两个小钩子啊,两个小钩子这个呢,我稍微的给它放大一些吧,放大一些啊来放过来,然后呢,这个呢,我们也放过来,诶好了,诶老师,为什么你画了两个小方块呢,这两个小方块啊,就像咱们两个小钩子一样,那么这个两个小钩子呢,一个咱们称之为叫什么呢?叫first。
02:02
一个叫做我们的last,啥意思啊,头尾啊。我们的链接的话,链接的话那么有头有尾,把它把头和尾连接在一块的感觉嘛,对不对,哎,所以啊,我们这里叫first,诶,我们这里叫last。行了,咱们大概的把这个说完了以后,那么它是如何存储和管理数据的呢?我们先给大家用图形的方式来描述一下,我们再给大家演示这个集合是怎么用的啊,首先我们先往里面添加第一个数据,所以呢,我们这里写上它。把这个拿过来啊,拿过来,我们现在呢。写上。我们的增加啊,第一个数据好了,那么你增加第一个数据的时候,我们怎么增加呀,非常的简单啊,同学们来,我现在我就假设呀,我现在增加我的第一个数据,这个数据叫什么名字呢?我就叫张三吧,来写上它我们就叫张三好了,我现在把这个张三往里面放的时候,同学们记住了啊,我要有一个链接的感觉在里面,诶,什么叫链接啊。
03:00
我的这个小钩子,我的这个小钩子把它勾上啊,所以我们的箭头,诶我们就拿过来了,对吧?诶拿过来,拿过来以后把这个箭头给它勾上,然后把这个箭头呢也给它勾上,老师我不明白,其实啊,大家想想就是告诉你啊,当前集合的头是它,我们的尾也是它。就这个意思。啊,那老师,那我们第一个数据好像比较简单呀,那我们第二个数据怎么样呢?所以啊,咱们来复制一下,复制以后来我们现在放第二个数据,所以往这我们这里改成第二个数据啊来那么改完了以后,我把这个给它拉长一些了,为什么要拉长一些呢?大家想想有个问题啊,什么问题呢?我们的第二个数据按理说我们是向后增加对不对,所以我的拉呢,我们这么放应该是没有问题的,然后呢,我们的张三我往中间放,然后呢,这个箭头呢,诶我往这边放,我们这个增加数据,我们一般啊都是往后放,所以呢,我们的张三我们放过来,诶好,把这个我们写上,它叫做date,诶就是这样写了,写完了以后颜色呢,给它一个这个颜色,给他一个透明吧,诶透明一下虚线一下啊好了,这个呢,就是我当前准备要添加的数据往这个地方放就行了,对不对,那么我前面这个地方难道就不能放了吗?你想想有头有尾啊,那么有头有尾的话,我增加数据要么往前要么往后,这不都行吗。
04:19
哎,老师啊,那如果我增加进去以后,那么张三跟这个数据之间什么关系呢?其实你想想它不是勾子吗?那么勾子的话就互相给它勾住就行了,所以啊,我们现在放这里,然后呢给它放到这儿,然后呢我们复制,复制过来以后,同学们我往这放就可以了,来把它复制一下。好了,我复制完成以后,同学们有一个问题出现了啊,有一个问题出现了什么问题呢?同学们想一想,我们如果我现在把数据给它放过来的话,那么我放到这和放到这儿是不是都可以啊?但是我默认怎么放呢?我默认就是往我们的后面放,所以来把颜色咱们标记一下,好标记以后怎么办,我来第二个,第二个数据呢,我们就叫李四了,所以我把它写上它我们叫李四,那么这个李四呀,我就准备往里面放数据了,但是我说过了,默认情况下就是往后面添加的意思就是你这么一加就行了,把这个箭头一连,把这个箭头一连,把这个箭头一连理四就有了,就是这个道理。
05:17
老师,那我想往前放行不行呢?那当然可以了,只不过要采用特殊的方法,所以我们增加第二个数据,咱们写上一下,可以增加到我们第一个数据的前面,它也可以啊,也可以要增加到。我们数据的后面,那么我们默认啊是增加到后面,增加到后面诶给他说清楚就可以了,哎,老师啊,那这不挺好的吗?那么如果我们现在增加我们的第三条数据,会出现什么情况呢?来复制复制以后来咱们往后接着挪。然后挪完以后,同学们这个时候你会发现我们当前的这个地方干嘛呢?理四已经有数据了吧,所以把这个理四给它划过来,把理四画过来啊,哎,把这个放过来。
06:02
放过来以后把它拉长一些,哎,咱们拉长一些,好把last呢往这放,然后呢,我们的这个理式呢,往这放可以了,好,箭头往这放,同学们你会发现我们的date呢,我们在这儿,诶好,大家可以看到张三和李四就是我们当前集合当中的两条数据,所以把颜色呢我统一一下,现在我准备要增加我的第三条数据了,所以来把这个文字写上,我们增加我们的第三个数据。同学们,你会发现我增加第三个数据跟之前它又不一样了,为什么不一样了?大家看一下我们的第一个,我增加第一个数据什么都不用想,把两个勾子往上一勾就完事了,但是呢,如果我们增加第二个数据的话,就考虑到一个位置的问题,不是我们前面就是我们后面,对不对?哎,如果增加完了以后,我们再把钩子给它勾上,但是当我增加我们的什么第三条数据的时候,你会发现问题又来了,因为它又多了个位置,什么呢?我们的头,我们的尾,我们张三和李四的中间是不是也有一个位置呀?
07:00
那么就意味着你当前的数据你应该放哪去,同学们这个能明白吗?所以说把这个呢,给它放过来啊,放过来,把这个给它放上去行了,那也就意味着我现在呢,我们有123有三个地方可以放数据,那怎么放呢?同学们很简单,这个呢,我们还叫头。这个还叫尾往头放,往结尾去加数据,那这个我们就称之为叫插入了,所以啊,我们这里呢,来说一下。我们可以啊,可以在我们的集合的前面增加数据,也可以我们后面增加数据,对吧,这个也是可以的,还可以啊,还可以在我们的数据之间啊增加数据,这也是可以的,哎,老师,那要照这么说的话,那么我们增加的话,我们怎么去找到他呢?比方说我这里呢,我们来一个我们的王五好写上他。好了,那我写完了以后,我这个网五怎么放呢?其实跟之前是完全相同的,什么意思啊,你把网五呢,你放到这儿,诶,就是他们加上勾是吧,把它勾上,那么你如果放在这里的话,那么就说明把它们加上勾就行了,你往我们的中间放的话,其实就是把它们都加上勾就可以了,同学们能明白老师说的意思吗?也就意味着这种处理方式其实就等同于将数据通过链接的方式组合在一起,它形成了一种特殊的链接结构,咱们把这种结构呢,我们称之为叫链表结构啊。
08:31
诶,就这样这种结构啊,它其实是没有索引的,它没有索引的话,但是呢,我们link list和那个a list,它们实现了相同的list史的集合接口,所以其中的方法呀,都有索引的概念,那么有索引的概念,但是我这里没有索引怎么办?诶它就按顺序了,比方说这个就叫零,对吧,这个就叫一,这个就叫二,这个就叫三,这就叫四,当然了,你这线没有值嘛,如果没有值的话就不考虑了,那么它就是第一个零,那么它就是第二个是吧一对不对,所以啊,我们插入数据还是有索引的,只是它的内部没有索引的概念,但是呢,我们用起来是可以用索引的,它其实就可以理解为这个顺序号,只不过这个顺序号呢,是从零开始的,对吧?哎,这个咱们分清楚了就可以了啊。
09:17
好了,同学们,我们大概的这个数据的原理呢,给大家解释了一下,我们现在来演示一下它的基本操作,所以我们回来接下来我们来给大家讲一下这个link的历史的一个构造方式,我们就先写上我们的它,咱们叫做构建集合对象,然后呢,我们写上它叫link的list,写上一个list等于new,咱们叫link的list,好了,这样的话,我的集合对象就构建好了,我们这里呢,我们给它CTRLP,我们提示一下,你会发现它里面就只有两个不同的构造方法,一个是无参的,一个呢是我们通过集合给它传进来,跟之前的那个release的差不多,但是又有区别,对吧,这个咱们就不演示了啊。好了,我们接下来给它增加第一个数据,叫增加第一个数据,那么你增加第一个数据的话,我们的list就叫A,然后我们就往里面写就可以了,咱们就叫张三,同学们不要忘了啊,咱们之前给大家讲了,我们增加第一条数据的时候,其实很简单,就是把头和尾把它勾上就行了,链表链表给它。
10:17
扣起来对不对,好了,这里我们写上它,咱们就打印。打印集合的数据那么好写上它,咱们就打印,然后把那个list,诶放进去,行了,我们运行一下看结果。运行以后张三不就进去了吗?哎,老师,那怎么证明他给勾上了呢?所以啊,我们这里要写上它来。我们todo叫获取数据,来我们的list,它里面有一个叫get first,诶同学们看这个名字很好理解吧,获取你的第一个就是那个钩子呀,把那个第一个给我连上了,所以呢,我们打印一下,打印以后你来运行一下,你看一看。我们的first a不就是张三吗?就说明我的第一条数据,这个first已经把这个数据给它连接上啊,就是这个意思,老师,那你这个last不是也勾上了吗?不也连上了吗?好,我们试一试把它去掉,我们写上它,我们叫list。
11:15
点我们的get a last,好了,我们点一下,你会发现应该是没有问题的运行。运行以后看结果你会发现没问题吧,两个都是张三对吗?诶就是这样的。哎,那好了,同学们,我开始要增加第二条数据了,咱们的第二条数据可是说了,你可以往张三的前面放,也可以往后面放吧,那这个我们该怎么去操作呢?所以同学们,我们来看一看,我们这个里面,我们就写上它,咱们叫list点我们叫I,有没有发现我们的I的方法,除了我们的这种爱以外,还有一个叫I first和I last,那我就先放第一个。咱们叫first,我把那个李四呀,我放到前面去,如果我是这么放的话,同学们,那么他就会把我们的李四干嘛呀,放到这个位置,你放到这个位置以后,你的first去链接到它就能取到了,所以我们的first应该取的是李四,而我们的last因为没有它嘛,那么这个箭头应该直接指向的是张三吧,所以我们运行它应该是李四张三。
12:21
你会发现我们的结果就是李四和张三,那么它里面的存储顺序也就变成了李四和张三,对不对?没问题吧,同学们,这个咱们需要注意一下,这个呢,跟咱们前面所说的那个插入顺序就稍微的有点不同了,为什么?因为啊,你改变了它的位置嘛,本身默认的是一个一个往后加,但是呢,你突然往头上去加了,往第一个去加了,那第一个不就被变了吗?所以啊,这个跟咱们前面讲的那个插入顺序有点不尽相同啊,诶老师啊,那如果我现在增加我们的第三个呢,所以我们再来一个,同学们我再来一个的话,我们看这个图。你会发现我们就有三个位置可以加了吧,那这个加它是头,它是尾,它是什么,它是中间的值呀,所以我们来写上它,咱们就叫list点有一个I的方法,这个I的方法是要加索引了,加索引的话,我就写上一个我们的一,然后呢,我们写上它,诶我们叫做王五。
13:19
我为什么写一呀,大家看一下,因为我们这里没有索引,所以呢,我们的它我们就会被标记为我们的索引,它是个零对吧?然后呢,我们这个地方就会被标记,为什么呢?我们的一,你的目的不就是为了把王五放在张三的后面吗?然后把它后面再跟着李四吗?所以这个时候他就会变成一,他就会变成二,对吗?哎,这就是我们想要的,所以呢,我们写个一,再写个王五,那么最终的结果应该是我们的张三,王五和李四吧,那么我的first就会连接到张三,我的last就会连接到李四,所以我们来看看。运行以后看结果你会发现没问题吧,我们的这边。
14:02
诶,我刚才是不是哦,刚才是改了一下是吧,我把李四放前面了,所以我们打印的结果是李四,然后呢是我们的王五,然后呢是张三,没问题吧,同学们哎,只要把咱们这个图啊,咱们给它考虑清楚了,这个关系你能明白我觉得就可以了啊好了,数据的增加呢,我们就演示到这里,我们把这个都注掉啊,咱们演示演示就可以了,来把这个呢,我们租掉,把这个呢咱们也租掉,咱们把这写上它啊,咱们张三李四,然后呢我们的王五,好,接下来我们给大家便利咱们的数据,所以todo咱们叫获取数据,然后呢,括号咱们叫便利数据获取数据啊,咱们刚才已经说过了,什么get first呀,Get last,其实我们也可以根据它的位置来获取,所以list第二我们叫get,你这么写了以后,你给它一个一,就表示它的索引位置,那么这时候我们直接打印,你打印以后我们的012,那么这个理四就会被打印出来,怎么运行。运行以后理四不就出来了吗?对不对,诶没有任何的问题,还有呢,我们不想一个一个获取了,我想把集合循环便利,所以for循环写上它,我们叫做int,诶我们写个I,它等于零好了,然后呢,I小于啊,我们集合的长度list的点S,然后I加加可以了,你写完了以后,我现在直接去打印我们的集合的每一条数据,叫get,我们的它写个I就可以了,上面这个我就先给它注掉了。
15:28
注掉以后,我们现在运行以后看一看结果,你会发现没有任何的问题,对不对?张三李四王五,这是完全可行的。好了,便利集合我们就演示完了,但是大家会发现我们的这个集合本质上是没有索引的吧,它的底层是一种链表结构,那么也就意味着我们根本就不想根据索引来访问数据,我就想一个一个取,对不对也可以啊,咱们之前不是讲过一个叫增强for循环吗?咱们写上一个for,我直接把集合中的每个元素取出来,给它一个冒号,我们就叫做list,这样的话,我集合中的每个数据不就取出来了吗?好,我们去打印一下,打印以后把它拿过来,这个咱们注掉。
16:09
做掉以后我们这里呢,运行一下就可以了。好了,运行以后大家会发现也没有任何的问题,对不对,张三李四王五。行了,那么我们的获取数据和便利数据啊,我们就讲到这里,接下来我们再往下把这个呢,我们都给它注掉。下面呢,是我们的修改数据啊,修改数据,那修改数据就没得说了,那么我们以前不就说了嘛,我们可以把指定位置的数据进行修改吗?那所以我们写上它叫list.site有个方法,你要传一个参数,这是我们的,所以把它改成我们的王五或者改成照六吧,诶改成我们的赵六,你改的时候大家可以看到我们的数据呢,是张三李四王五,那么一的这个位置就是我们的索引了,零一等同于你把理四改成我们的照六,就这么简单对吧?好,我们运行一下。
17:00
运行以后我们看结果,那么你会发现张三赵六,王五李四被修改了,对吗?诶好了,行,那修改呢就比较简单了,那咱们接下来讲一讲我们的删除数据,那其实就更加简单了吧,咱们的list的点不有个叫remove吗?这个大家会发现,就把我的数据删掉就可以了,比方说把张三删掉好了,那么你删掉的过程当中,大家会发现我张三给它删掉以后,这个本质上就等于把这个链接的箭头给我去掉,你去掉以后同学们不要忘记啊,这个比较特殊了,我要删除数据的话,我数据就给它去掉了,比方说我的网我没了。你王五没了的情况下,那么我的箭头就自动就连在一块儿了,那这样的话就等于把张三和李四连在一块儿,诶就是这个意思,所以啊,这个可能底层有点复杂,但是我们直接删除还是比较简单的,所以我们直接点击运行张三李四王五,把张三去掉,不就只剩下李四和王五了吗?所以啊,最基本的增三改他相对来说还是比较简单的啊。
我来说两句