00:00
大家好,我是海波老师,接下来我们来讲一讲Java集合中的Q接口啊,这个Q接口呢,它也是我们Co接口的一个子接口,其实啊,这个接口啊,就类似于咱们生活中排队的概念,就好比啊,我们买东西排队,那么第一个来的人肯定排在我们队伍的第一个对吧?那么第二个来的就排在了我们的第二个,那么以此类推啊,最后一个来的,那肯定就是最后一个了嘛。那么第一个人东西买完了,他就需要离开这个队伍,然后呢,该我们的第二个人买东西对不对?这个还是很好理解的,但是如果第一个人离开了队伍以后,他又想买了怎么办?还能回过头来排在前面继续买吗?是不是不行啊,他是不是应该只能排在队伍的最后面了才可以啊?这就叫秩序对吧,也叫规则。生活中啊,这种排队的场景应该比比皆是了,对大家来讲应该还是好明白的,那你说老师我就不想排队,我就想要插队行不行?当然行了,对不对,只不过呢,会影响身高嘛。好了啊,给大家讲这个生活中排队的例子呢,就是想告诉大家,这其实就是Q接口的基本操作原理,那这个接口呢,咱们就不做过多的讲解了,直接给大家演示就可以了,那么来我们这里创建新的一个代码来拷贝,拷贝以后呢,我写上一个幺零,然后把后面的这个地方改成Q,好,点击OK,点击OK以后把这些东西啊,咱们都给它去掉,然后呢,给它替换成我们的这个Q就可以了。啊来好了,我们这里给大家演示的呢,叫做array啊,咱们叫blocking q,就是这么一个Q啊,然后呢,我们写上Q,然后呢,等于我们叫做new,然后呢,把array blocking q我们放过来就可以了,放过来以后,首先呢,我们还是从名字上我们稍微的分析一下,这里的瑞就表示数组很容易就明白,这个集合的底层应该和数组有关系,对吧,也就是排队的时候啊,我们采用数组的方式。
01:49
哎,老师啊,那采用宿组的话,那列表不行吗?当然可以了,大家想一想,如果使用宿组排队有点什么感觉呢?就好比准备了十个凳子,第一个来的呢,就坐在第一个凳子上,那么第二个来呢,就坐在第二个凳子上,那么这就是宿主实现排队的感觉。那么如果是链表来排队呢,就好比去银行办业务取号一样,银行啊,是通过发那个顺序号啊进行排队的,人是不是在一起并不重要,所以即使没有一个真正的一个队呀,当叫到你的号的时候,是不是你也知道是你啊,他也有一个队伍对不对,只不过那个队呢,不是按照你站的位置,而是按那个号码的顺序吧,所以啊,这也是排队,但是他们俩的方式呢,不尽相同啊,所以我们这里的Q呢,它采用的就是速度的方式。
02:32
好了,这个array说完了,那么咱们接下来说一下,这个叫blocking啊,咱们来拷贝,咱们叫blocking,这个blocking是什么意思呢?它表述是叫主色。和这个什么呢?叫堵住是吧,咱们叫做什么呢?堵住了不太明白是吧,怎么排个队还会堵住呢?这里怎么解释呢?这就好比啊我们去医院挂号一样,我们一天啊,医生能看的病人是有限的,比如啊我一天看40个病人,那就意味着我们排队看病的人啊,最多只有40个,那么排号呢,最多也就到40了,你号满了,你是不是就不能再挂号了,对不对,哎,这是主数主数了的意思,除非啊咱们在医生看的很快是吧,临时呢加几个号,这边呢,诶看完了你那边再加几号,那有可能让你继续挂号,但是我们一般情况下,一旦挂满了,是不是就不让你挂了,所以他就堵住了,就是这个感觉啊,所以这个blocking就有这么回事了啊,所以我们再加上一个Q,那就不说了,这就是Q接口嘛,这样的话,我们通过名称上就大概知道它是干什么的了啊好,那么这里呢,有个红色的波浪线,表示的是这么写不对。
03:34
不对的,原因很简单,你底层不是有数组吗?你没告诉他这个数组的容量啊,所以咱们CTRLP,大家会发现,我们这里呢,就会有一个容量的概念,我这里呢,给它一个三吧,这个三什么意思,它底层的数组呢,就是三个,也就意味着你放了三条数据以后,它就堵住了,就是这个感觉啊。好了,同学们,我们现在呢,就给大家演示演示它具体的操作,那么首先我们就一个一个来,我们写上它,咱们叫做Q啊,然后呢,我们点咱们就叫爱的,你看非常简单,我们往里面放什么呢?我们的张三,好了,我放张三,记住我放第一个,你放第一个应该没有问题,所以来我们打印一下,咱们就写上Q就可以了,好,我们运行运行以后看结果。
04:17
你会发现没有任何问题吧?好,那么我们的张三我们放进去,咱们再来放一个叫李四。对吧,那么我们再来放一个,咱们叫王五嘛,那么大家看一下,我们说了当天的容量是三个,那么张三李四王五你这里不就放满了吗?所以我运行运行以后咱们看结果,你会发现我们这里张三李四王五没有任何问题,而且呢,你第一个放进去,你取出来的第一个不还是他吗?对吧,咱们叫张三李四王五,顺序还是对的,老师呀,我想放第四个对吧,你总共三个,我就想放第四个行不行,咱们的Q来,我们写上他第二增加,我们写上一个叫照六,哎,好了,写完了以后呢,我们现在咱们来观察一下,我们运行运行以后看结果。
05:01
看结果以后,大家会发现这里就发生了一个错误,他告诉你Q已经满了,所以啊,咱们这个地方就写上它,诶我们就发生我们的错误了,嗯,那么我们的Q他已经满了,对吧,跟咱们前面说的是一样的吧,他满了,满了你就不能再挂号对不对,你还挂那挂不上,或者说出问题,不就这么回事吗?诶老师那怎么体现出堵住了呢?记住同学们这个方法它没有堵住的概念,所以呢,我们这里说一下。我们的这个I的方法呀,爱的方法,它如果增加数据增加不了啊,增加不了它直接发生错误啊。它并不会堵住,那么我们现在呢,把这个住掉,住掉以后干嘛呢?我们用另外一个方法往里面放,大家看一下,我们叫Q,这个Q呢,我们点有个叫put方法,这个往里面放,这个呢,咱们还是写上张三,诶我们写上它,我们叫做李四好了,然后呢,我们再写上一个我们的王五好,好了,我们这里有红色的波浪线,我们之前就给大家讲过,这就是我们有异常了,所以呢,为了简单起见,我先在这个方法的这边,我直接把异常抛出去啊,来,好翻过来。
06:09
放过来以后大家观察一下,我现在呢,我们就张三李四王五了,那现在我运行一下,运行以后大家看结果,你会发现我们当前的张三李四王五是没有任何问题的,好了,我们这里呢,再给大家加一个,我们叫什么呢?我们叫做赵六,诶咱们选赵六行了,好了,那现在呢,我们执行一下,咱们看结果,你会发现我们控制台上一片空白,而且这个红钮啊,它没有停,说明我的程序还在一直运行,诶老师这里怎么什么也看不见呢,所以啊,他什么也看不见,你就什么都不知道,那怎么办?我们这样啊,我们在这里呢,我们给他来,我们打印,咱们写上啊第一个人啊,咱们就挂号,诶好,然后呢,我们再来复制。复制以后,我们再写上他,我们第二个人挂号,再写上第三个人挂号,这写上我们的第四个人挂号,所以呢,我们写上二啊,第二个人写上二,然后呢,这边写上一个我们的三,哎,好,这里写上第一个四行了,写完之后呢,我们运行一下看结果,运行之后大家观察一下,我们的1233个人挂号以后,号满了吧,号满了的话,后面的人想挂号就挂不了了,还得等在那。
07:15
堵住了。干嘛呀,万一我的医生看的快,诶很快就看完了,万一我还能加个号什么的,对不对,所以后面的这个代码呢,就被堵住了,我们就称之为叫主塞,也叫blocking,就这个意思,所以啊,你会发现我们那个代码呢,根本就没有结束,哎,这就是我们put方法,它起到的一个效果,现在能不能体会一下什么叫做阻塞的概念,哎,就是这样啊。那么我们往里面放数据的话,如果每回都报错的话,那你也不方便,对不对,比方说我不想阻塞,我就想往里面放,但我放不进去呢,我不想发生错误怎么办?你这么写的话,他会阻塞,你这么写啊,就不让挂了,你也不用等了,我今天40号已经满了,你不要再去挂了,你要想挂号等明天吧,但是呢,你说我一挂报错那不好,所以啊,有没有什么别的办法让他的这个操作更友好一些呢?诶给大家讲一下,把这个做掉,做掉以后其实我们还有一个方法来咱们说一下,咱们叫什么呢?叫做Q,咱们点一下叫做offer。
08:10
这个offer呢,也能往里面放数据,所以咱们选上它,但是呢,它返回的结果大家会发现它是一个什么布尔类型的,这个布尔类型什么意思呢?就是如果我添加数据成功了,它返回的结果为true,所以呢,我们这里写上它,咱们打印一下咱们的张三,诶咱们打印一下啊,咱们这个张三好了,然后呢,现在呢,我复制一下啊,复制复制以后,现在呢,来把这个改成我们的李四。好了,然后把这个呢改成李四,诶好,把它改成李四,把这个呢改成王五,把这个改成王五好了,行,我现在呢,往这个集合里面去放我们的三条数据,放三条数据的时候,大家会发现我当前没有任何的问题,我三个全是处说明都放进去了,张三李四王五,但是呢,我准备放我们的第四个了,第四个呢,我们叫照六,所以啊,把它改一下,我们叫做照六,你改完了以后拷贝,然后呢,我们拿过来,拿过来我再去运行,运行以后看结果你会发现我们的照六根本就放不进去,为什么呢?他写了个force,它这里不会发生任何的错误,它也不会阻射,只不过它就直接给你个false,你别挂了,对吧,咱们友好点,你别出错是吧,你就别挂就完事了,你明天再挂就可以了,所以啊,他表现了这样的一种情况,哎,老师啊,那么你能往里面放的话,能不能往外取呢?其实肯定是没有问题,对不对,所以啊,咱们这里来写上它,咱们叫做打印,怎么往外取数据,怎么取数据呢?我们叫做Q点,它会有一。
09:37
一个铺这个方法来这个方法,这个方法呢,可以把我们的数据往外取啊,所以呢,大家看一下,我运行一下,运行以后咱们来看一看啊,哎,你会发现我们现在的这个张三就被取出来了,那么咱们这个排队当中啊,只剩下个李四和王五了,啥意思啊,第一个人已经看完了,看完了以后该第二个人了吧,所以他就该离开了,所以就没他了,你再走一个对吧,那就意味着我把第二个人拿过来,你要第二个人给他拿出来是吧,去看病去,那么好,就剩下我们的是吧,那么排队的应该剩下第三个了吧,所以运行运行以后,我我第一个取出来的是张三,我的第二个是李四,那还剩下排队的不就是王五了吗?那么我们再去,你再来一个的话,我们再去取的话,那么我们这个不就取得了我们的这个王五了嘛,对不对,那么排队就没有人了吗?哎,就这个道理。
10:25
哎,老师啊,那如果队伍里没有人的话,我再去取数据呢,所以呢,我们再来运行,运行以后你看结果,你会发现我们现在排队的总共有什么,我们的三个人,但是你取第四个人根本取不到,所以他的返回结果就是一个空,就是这个意思啊好了,这个呢,给大家去讲讲就可以了啊,我们除了我们的这种方式以外,其实还会有一些别的方法,比方说我们还有一个方法把这个做掉啊,咱们做掉来把它去掉,去掉以后我们写上它,咱们叫做点,我们叫take。这个take就拿数据呀,拿数据来吧,我们写让它来,我们现在有三条数据给拿出来,咱们运行,运行以后咱们看结果,哎,大家看一下,我们当前张三李四玩五没问题吧,我们排队的人没有吧,哎,有没有了,所以呢,这样的话是没问题的,但是如果你再干嘛呀,去获取我们的数据,我们点击右键再去运行,运行以后你就会发现我们当前的这个地方,张三李四王五取出来了,但是后面的程序就不会再执行了,这个时候它也处于阻塞状态。
11:28
同学们看到小红钮了吗?他还在开着呢,就说明当前的程序还在跑着呢,可是他就打印不出来现在排队的情况,老师,这是为什么呢?其实很简单,因为啊,咱们当前取这个我们的数据的时候啊,那个医生就发现呢,哎呀,今天看的挺快呀,这还没到下班时间,都已经看完了,那能不能再看几个病人呢?我等等吧,我等着再有人挂号的话,我就再去看,他是干正事用的。所以啊,你会发现同学们,我们会有很多的方法能够做不同的用途啊,像咱们之前给大家讲的什么put呀,什么爱呀,包括我们的offer啊,包括我们的这个poor啊,包括take呀,都可以实现不同的功能,其实功能还是非常强大的啊,那么除了这些方法以外,其实还会有一些方法,比方说咱们前面讲的一些东西,比方说我们的Q啊,点一下什么size,对吧,我们的Q点it empty啊,It empty,还有我们的咱们叫clear,你看这些东西啊,基本上全都是有的,只是呢,我们就不再一个一个给大家演示了,咱把这个Q咱们说清楚,把那个主色的概念说清楚,其实就够了啊。好了,我们这个Q就先说到这里。
我来说两句