00:00
那么接着的话呢,咱们再来看一下这个层次二啊,针对这个例子的话呢,我们看一看它不同的实现类的一个区别,哎,所以这块呢,我们就可以呢,把这个啊,包括这个collection,咱们也给它CTRLC一下吧,拿过来这块我们来看一看它的啊实现类的具体的特点是什么。好例子呢,我们已经说了是这样的一个特征了,是吧,然后具体我们看这个实现类,哎,我们把这个。往下提一提啊。看一下这几个类的区别。哎,这么着啊。好,那么这儿呢,我们就提到了这样的三个实现类了。啊,这三个时间类当中啊,哎,我们先来看一下这哥俩。哎,先看它俩啊,这两个的话呢,我们提到了这个a list呢,它叫做啊list的主要实现类。啊,这个主要的话呢,其实就明确了,咱们只要没有特殊情况的话呢,如果我们要想啊,有一个list了这块你就去一个a release就行,把它作为一个默认的选择啊,那么这个的话呢,它其实翻译过来叫做向量。
01:05
当然这个其实你不翻译呢,也没什么啊。这个的话呢,咱们在哪用过呢,还有印象吗。对,有一道课后题,咱们在讲包装类的时候。啊,包装类的时候呢,我们做了一道课后题啊,就是这个成绩的这个题啊,用过这个vector是吧。诶,它呢,作为一个容器,咱们当时呢,拿它是替换的数组呗。是吧,哎,当然我们为什么要在包装这块讲呢?因为它在添加元素的时候呢,只能是添加对象嘛,所以当初呢,咱们说得去装箱是吧,然后他取的时候呢,哎,它只能是取出来也是个对象,所以我们再去让这个对象比较大小,还得拆箱。所以当时呢,我们是拿这个VE来说的啊,但实际上开发当中我们用VE已经很少了,它呢是咱们历的一个古老的实现类。诶,古老式眼泪,说白了就是不用了是吧。这个老到什么程度呢?
02:00
啊,你看下我们这个API这块啊,比如说呢,我们看一下这个啊,咱们先看一下这个A吧。这个的话呢,它是在JDK1.2的时候引入的。呃,然后呢,我们看一下这个它实现的这个接口叫做list了啊list呢一点开。也是在01:20的时候引入的。好了,那就说1.2,之前呢,其实是没有集合,我们现在涉及到这样的一些接口的,接着你再看一下这个vector。Vector这块它是吧,点进来它呢,是在JDK。1.0的时候引入的。哎,这就感觉有点。嗯,不太正常一样是吧,按说的话呢,你不得先有对应的这个接口才有实现类吗?其实你会发现呢,我们在最初的时候设计这个JDK的时候呢,我们其实确实提供了一个容器啊,你就要集合也行,这时候呢,就是我们说的这个叫vector,一开始呢,都用的是它1.0 1.1都用的它,然后到1.2这个版本的时候呢,相当于对集合这块呢,重新整合了一下,引入了一个接口叫做list。
03:01
但引入接口以后话呢,让这个类呢实现这个接口了,但是并没有把它作为一个主要实现类,而是呢,提到接口的同时,它自己又重新指定了一个叫做ara list了。它呢也是01:20度指定的,然后把它呢就作为一个主要实现类了,这个呢就不再用了。啊,其实就是这个意思啊,所以呢,你可以想象成呢,就这个呢,就好比是诶前一个皇帝的这个大臣是吧?哎,换了一个皇帝之后呢,他自己有指定自己的这一波大臣了,这个呢就不用了。啊,就是一朝皇帝一朝臣是吧。啊,这个呢,就挂掉了啊,这个呢,就是我们所谓的古老的实现类。那么我们这里就要问一个问题啊,说是因为他长得不好看吗?是为什么就不用了呢?呃,这块我们就提到了一个点啊,就是这个a release呢,它是一个叫线程。不安全的。啊,那么这个的话呢,是线程安全的。啊,那线程安全,线程不安全,表现出来特点呢,就是它的效率呢,会低一些是吧,而我们这个它的效率呢。
04:06
对,高一些。当然有同学会说,那我们要是涉及到多线程问题,那你总得用个安全的吧,没问题,即使这样我们也不会用它。啊,怎么办呢?那我就自己包一下是吧。哎,或者的话呢,我们后边呢,还会讲一个,哎,咱们讲到这个集合的时候呢,最后还会讲一个工具类,这个工具类呢,叫做collections加个S啊,这个工具类里边有相关的方法,比如你这块有个你不安全吗?你把这个你扔到它这个方法的参数位置,返回的一个就是安全。啊,其实也非常简单,就是他给你在里边包了一下。啊,也没做什么大不了的事儿啊,就拿C包了一下哈,所以说呢,我们即使有线上安全的需求,我们也会用a release,把它变成是个安全的,也不会用它了。那就彻底失宠了是吧?啊OK啊呃,另外一点的话,其实大家你看这个API的时候,你会发现什么呢?因为它出生嘛,1.0就有了,所以呢,你看我们刚才做这个题目的时候。
05:04
然后把刚才那题目还给关掉了是吧。你看我们做这个题目的时候呢,里边呢,其实对应的这个方法呀。也比较传统。哎,在这个练习这块,你看咱们获取这个元素的时候呢,刚才我们说了一个是不是叫get。呃,然后呢,你要是想往里添加的话呢,是不是就直接艾特呀。对,他最初呢,设计这个VE的时候1.0,有的时候呢,他这个方法你看就挺长的哈。那后来有了接口了,然后他还实现这个接口了,他呢,又把这个爱的方法和这个get的方法,他自己又重写了。嗯,就是相当于他有两套这种加的,包括这样的方法是吧。你看这个看着也不太友好,也不用了啊。这这个大概能听懂意思吧。嗯,OK哈,行,哎,总之的话呢,这个不用了啊。那么它俩的主要区别呢,其实就是我们说的这个事儿哈,呃,那还有一个共同点,共同点的话就是他们底层使用的结构呢是一样的。啊,这个我们说底层呢,使用的叫object类型的数组。
06:03
存储。啊,然后呢,我们这个呢,也是一样的。哎,说白了啊,这两个结构底层还是数组。啊,还是数组啊,那可能大家就会想了,诶刚才不是说了叫动态数组吗?动态怎么体现动态呢?反射数组呢?不都是,呃,一旦初始化,其长度就确定了吗?是吧,那你咋动啊?是吧,诶这块呢,其实是怎么着啊,就是数组呢,还是咱们原来讲的那个特性哈,一旦呢,初始化长度就确定了,那么对于俄release来讲呢,其实我们在创建release的时候呢,它底层呢,先默认给我们指定了一个指定长度的一个数组了。比如这个长度呢,它是十。好,然后呢,你这里边儿去不断去艾特艾特艾特往里加就行了,你不用考虑是不是说我们这个会超过这个数字的长度。因为呢,一旦呢,要超过的时候呢,它底层会自动的帮你去做一个扩容。控制完以后的话呢,还自动的把这个数据呢,给你都复制过来了。
07:02
诶,我们只管往里边去艾特就行。从这个角度上来讲的话呢,底层的这个事儿呢,他都做了,不用我们管了,所以呢,就像一个动态的一个效果一样。是吧,哎,就是这样一个原因啊好,这个呢,就是我们说的这样的一个场景,哎,先说到这儿。好,这俩呢,我们就说清楚了。哎,在一些笔试问题当中,有时候会问啊,但即使不问呢,咱也知道这个哥们儿呢,现在已经不用了啊好,那把它呢推下来。然后接着我们来看这俩。这两个有什么区别呢?这个叫a list,因为它的底层是用的数组。就array是吧,数组嘛,然后这个呢叫link。对,这个link呢,就是链表的意思啊,你看下我们这个API里边,比如说咱们看一下这个叫link的意思啊,这我放了个图,就跟这个铁链子一样啊,啊,一个这样的一个的这样的挨着。啊,这就叫链表的意思啊,好,那么这个link的意思呢,它的主要的一个特点,相较于我们a release区别啊,名字上呢,已经明显的表现出来了,它呢底层使用链表的方式呢,进行数据的存储。
08:10
啊,底层使用。啊,这个呢,我们其实呢是一个,哎,双向链表。啊的方式。来进行。哎,存储。哎,这块就是它的一个主要的一个区别了,是吧,那表现出来的我们什么时候会用a release,什么时候会用link list,其实也主要取决于它的底层的术语结构不一样。那我们进一步就要说,什么时候我们会用它呢?那我们说呢,大部分情况都用它。啊,那我就说那什么时候呢,会考虑用它呢。哎,那这呢,就是看一下你双向链表跟他比有什么好处啊。修改数据的时候是吧,对这块呢,其实主要就是说我们数组呢,在某一些场景下呢,使用起来效率就会比较差一些是吧,前面呢,咱们做这个项目呢,当然也做过这样的问题了,数组的特点呢,就是依次紧密排列。
09:04
那如果说我现在要把这个数据给删掉。你是不是就得一个一个的往前移是吧?哎这样不操作不行,因为呢,你要体现这种依似解密的一个效果了,但是如果呢,我们要是使用的是这种链表的特点,链表的特点呢,就是它在数据当底层那个内存当中啊,它不是挨着的啊,诶它就通过一个指针的方式指向下一个,这个呢再指下一个,这个再指下一个。啊,以此类推,当然这块我们说到叫双向列表了,就是你下一个呢,也知道上一个是吧。哎,就这样个情况。哎,这呢就叫做双向链表,好,比如我现在想把这个元素删掉。或者你再假想一下,夸张一点,我们现在有1万个数据是吧?1万个数据呢,如果是用链表的话呢,我想删除第三个元素,那跟第一个呀,还包括第第四个之后的这些元素,是不是一点关系都没有。对,我们要做的事呢,就是怎么办呢。诶,这个换个颜色啊,诶这个元素呢,有一个next这个指向它是吧,你要把它删掉,你把你第三个元素的这个next,这个索引地址呢,你给了我,我指向你的那个next。
10:09
是吧,诶然后呢,这个第四个元素呢,它往前指,然后呢,你把你的这个指向上一个的这个ne,这个值你给了我,我指向你的这个ne。这样的话呢,不就把这个事儿呢,就给它过掉了吗。哎,跟其他的都没有关系。换句话说呢,我们现在不想删了,我想添加一个元素。比如我在哎这两个元素之间啊,因为它后边呢,可能还有其他的一些元素是吧,我想在这两个元素之间呢,插入一个元素。你想我们要用数组的话呢,这个事儿又很繁琐。假如后边得有1万个元素哈,我现在想在呢这个位置呢,插入一个元素,那你得是不是先一个一个往后移是吧。啊,各种移啊,移完之后呢,把它放在这儿。哎,那要是用这个链表的话呢,就非常的简单了。啊,列表的话,你只需要呢,我们插入元素,简单来说的话,就就这样指一下就完了是吧。哎,这不就可以了,这个就断掉没有了吗。
11:01
哎,这呢,就插入完成。好,那么我们看一看啊,刚才我们这个场景如果呢,用数组实现删除,实现插入,复杂度是多少。On的是吧?啊,你比如说我们这个呢,想诶插入元素你都一个个往后移,是不是显然呢,跟N的一次幂是相关的是吧,是on的,而它呢。对,他是O1的。那么数组有没有好处呢?有对。比如说呢,我们想查指定位置上元素,一步到位,直接就找到这个索引了,是吧,所以查询的时候呢,它是O1的,而我们呢。它没有这个所谓的像数组一样,这个有多少偏移量,它就下个元素了,直接找那个位置,它呢,就得比如我想找第十个,就一个一个的往后走,找到第十个了,所以呢,他在这个查询方面呢,是。Own。以及呢,如果你要是插入的话呢,呃,他要是没有去记录尾部这个元素的话呢,如果要插入,诶不是插入添加的话。
12:00
啊,如果要记住一下尾部元素还行,直接往后加一个,但是要没有的话呢,是不是就得从第一个一直找到最后一个,在后边加一个,那还是欧了,对吧?但是我们这个数组的话呢,要是添加一个元素在尾部的话呢,直接就定位到最后一个直接加了,所以还是OE。哎,所以主要区别呢,它俩就在于啊,数据结构的区别,所以呢,我这块可以写一下啊,它的底层使用object这个数组进行存储啊,那这呢涉及到这个特点。也就是说我们这个release呢,说呢,哎,在添加数据啊和查找诶数据时。哎,这个效率较高。啊,然后呢,在插入和删除数据时。哎,这个效率呢较低。这个主要原因呢,就是因为它使用的这个数组的一个存储的特点啊,而我们这个另的例子的话呢,呃,这个对应的点呢,就我们刚才说的这个事儿了。哎,跟我们这个A呢,正好相反啊。
13:00
哎,这块,诶这个我把这个效率高的呢,写到前面吧。诶,它呢,在插入和删除数据的时候呢,效率较高。啊,然后呢,在添加数据和查找数据的时候呢,效率较低。哎,这样就行了,好,那这呢,其实也就决定了我们什么时候呢会用啊link的意思啊哎,我写到这儿吧,哎就是在哎对啊集合中的数据。啊中的数据啊进行较频繁的。啊,频繁的这个叫诶删除和。诶,插入操作时。哎,建议呢,是不是使用此类啊。OK了啊,注意这块我有个词呢叫频繁,那如果呢,你只是呢,删除一次或者插入一次,其实这块呢不明显是吧。啊,或者换句话说,有时候呢,你插入一次或者删除一次呢,呃,在有些场景下甚至还不如release了。因为这块它还有一对指针是吧,来去调啊好,那这儿呢,就是我们提到了他们的具体的使用场景,那整个呢,关于啊绿色这块呢,咱们就讲完了。
14:04
啊,这呢也会涉及到呢,就是在实际的这个啊,大家呢,笔试当中是吧,可能会问的这样的一个面试题哈。哎,这个面试题呢,一般问的时候呢,它通常呢,都是这样问的啊,就是他会问你这个a release,哎和这个vector呢,它的一个区别。啊,这个是一个问题,或者呢,他就问你这个a release。啊,和这个link的区别。啊,一般呢,很少见到了,就直接呢把他们仨放一起去问的。啊问前者的话呢,实际上呢,就想说的一个是现在主要用的一个是以前用的的事儿,包括呢,为什么不用以前这个了,是吧,来提一提这个呢,纯粹呢,其实在问我们这个数据结构的事儿。所以它是两个不同的角度的问题啊。行,那么关于这个list这块呢,咱们就,诶知识点就说到这儿了啊,下边我们来看几个题目,哎,通过这个题目呢,咱们去熟悉一下关于这个list的一个使用,首先呢,来看这个课后的练习一,哎这样说的说呢,从键盘录入学生的信息,保存到集合例子当中,哎,这块呢,涉及到这个学生信息了啊,有这个姓名年龄,我们呢,就封装到这个学生类当中,这呢实际上是一个哎扎病的一个设计了。
15:16
然后接着呢,使用这个呢,我们去装这些学生的对象,诶保存多个学生的对象,然后呢,诶这个继续录入选个一啊接入录入选个零,如果你选零的话呢,就把你已经录入的学生的信息呢,给它打印出来,这块呢有一个执行的效果。啊,比如这样的一个情况,OK啊好,现在咱们就以这个呢,作为一个参照来去做这样一个设计,这里边呢,我们录入的这个姓名和年龄呢,就把它封装到一个对象里了,这个对象呢,就是一个学生对象,所以首先呢,我们来设计一下这个叫学生类。C。在这个下边呢,我们首先呢,去新建一个叫做student啊。哎,对应的这个说明我们就放在这儿了,这里边儿呢,涉及到有private辞职类型的一个name啊private。
16:02
这个int型的age啊,基本的这样两个属性,然后呢,对应的这个结构啊,咱们都已经很熟悉了,首先构造器。啊,再来一个全餐的。哎,来概赛方法。哎,这块啊,选中一下,然后呢,To string。哎脱呢,我们加一下,诶,其实这里边呢,还可以再去加一些功能。对诶这块呢,我们只要呢是把这个元素呢放到我们的集合当中,这是我们目前用的list,那list呢也是一个collection,那collection呢,我们就提到只要往collection里面去存放数据的话呢,我们就有可能后期呢,比如说你去调这个remove啊,Contents啊是吧这样的一些方法,那么调这些方法的时候呢,它都会用到这个元素所属类的一个E方法,所以这块我们推荐呢,咱们就要把这个方法呢给重写一下啊,那怎么叫相同呢?呃,这块呢,比如说name和age呢都相同,我就认为呢,你两个呢是相等的,所以这块呢,就把这两个都勾选了。
17:01
这个呢是来计算哈伊库的了啊,这个判断一下,它是不是这个飞空的一个判断了啊,这个就去掉了,好,这个呢,我们就把它呢给注释一下,目前呢还用不着它。啊,其实呢,主要呢,是用它的这个方法,什么时候用呢,咱们讲set的时候呢,就专门来讲一下这个哈扣了。好,这块我们就先把它留着就行,当然你说我这个不注释,不注释当然可以了。是吧,行这呢,我们这个student呢,就写完了下边啊,在我们这个里边呢,创建一个。哎,死丢。哎,但它的一个测试了,哎回过来这块写成么方法吧。好,这块呢,根据我们这里的提示啊,说请录入学生信息。呃,这块呢,就没有再提这句话了,所以这块呢,就写一次就行啊。请录入。呃,学生信息啊,这样一个冒号啊,接下来的话呢,这个一继续录入零结束录入这个的话呢,会不断的出现,显然呢,是放在我们这个循环里边了。
18:00
这个循环的话呢,咱比如说就用一个Y循环吧,具体多少次呢也不确定,咱就写成Y处吧先。哎,在这里边首先呢,写一个输出语句啊,说一往后。继续。哎,录入啊,这个逗号一下。呃,零冒号。要结束。诶录入OK,然后呢,我们在下边呢,这一行写的这个数据,那这儿呢,有一个换行没问题,行,然后接下来的话呢,我们需要呢,输入一个一或者输个零,这就scanner了,SC的话呢,就不要在while里边呢去造了啊,没必要造那么多对象啊,哎,咱就写到这个上面吧。哎,一个啊,这个scanner啊,system.in啊,这个我们已经写了很多遍了啊好,你要怕万一呢,忘了去关闭,你先把这个关的操作呢,先给它写上啊。哎,这块呢,会提示呢,声音这是外务处,他说执行不到是吧,那这个不用管它,一会我们这个写完之后呢,它就不好错了。好,这个完了以后呢,我们在这个位置啊,通过这个scan去调这个next int这个操作,得到一个具体的一个选择啊,Selection。
19:04
这样啊好,那么这个selection的话呢,如果是一啊,你就继续录入就完了,如果是零呢,就结束了,所以这块我们就主要呢,就判断一下这个selection呢,它是不是零。哎,是零的话呢,我们直接就break就结束了。这样是吧,在这呢我们就能执行它了啊好,这呢是一个结束的条件,我呢就在这个位置写。这个位置起的话呢,相当于你输入的就是个一了,或者说你输入到是个二呢,二其实也就跑这来了是吧。啊,这个也行吧,啊,我们就跑到这来了啊,跑到这儿的话呢,我们做什么事呢,说请输入学生的姓名年龄,哎,继续的啊。行输入啊学生的姓名啊,然后这个呢,直接就在后边写的那把这个画行也去了吧。这是小细节啊,第2NET方法,哎,获取一个name。OK啊,接下来我们再去获取一下学生的叫年龄。CTRLC。哎,再复制一份。
20:01
哎,年龄,哎这个呢叫next,就这个呢,我们叫没问题啊。哎,这个呢是int类型的,好,这个得到以后的话呢,我们把这两个属性呢,封装到一个对象里边,诶我们就student s是吧,诶你有一个。Student,这呢是个name,这是一个age,哎,这么着啊好,然后呢,你创建好的这个对象呢,我们要把它放在一个容器里边,这个容器的话呢,提前也造出来啊,我们目前呢是使用a release是吧。诶a release啊好,前面呢,我们就声明为,诶有同学可能之前问过啊,说为什么我们前面这块老习惯上去写个list,等于new list,这就多态了啊。为什么老写成多肽呢?其实完全确实没什么为什么啊,这样写其实也行是吧。啊,写成类似呢,可能就是因为呢,少写几个字母吧。啊,因为呢,多肽这种场景呢,咱们说了主要用啊,还是在方法的行参位置是吧,体现的啊,在这种方法内部这种局部变量完全没有必要非得写成类似。
21:00
或者换句话说呢,万一要是这个所谓的子类也好,实现类也好,万一要是功能更多呢,那我们生命成一个子类也或者实现类呢,那反而掉的方法更多了,是吧?哎,那也就是说呢,在方法里边呢,我写成这样的方式反而还更好呢。啊,就在这块呢,完全没有什么道理啊,我也习惯那样写了,我是因为少写几个字母。好,这个例子的话呢,我们,嗯,接着呢,就把咱们刚才这个S呢,就添加进来就可以了。哎,没问题啊行,这呢是我们添加的一个,添加完以后的话呢,接着就回到我们这个外处这块啊,继续的问啊这样个场景,所以呢,这就不断的执行,直到呢你输入的是零,我们就结束这个外部循环,接入外物循环,诶我们就回到这个位置了,这个呢就要求呢去便利哎,集合当中的学生信息啊。呃,学生这个信息好,这个呢,便利的行为呢,首先啊,这呢,我们有一个输出语句啊,便利学生信息。
22:01
哎,就这么着了,下边就依次呢显示出来而已啊,这个呢,其实就是一个电力了啊,这个我们可以用迭代器增强for循环,一边的for循环诶都可以啊。嗯,这块的话呢,如果我们写成是一个一般,哎写一个增强号循环吧,这样写啊这个位置的话呢,呃,有没有同学会认为说这应该写成student。诶,会这样认为吗?哎,这个呢,你看我们添加进来的确实都是学生是吧?诶但是的话呢,这个方法呢,在调的时候呢,他认为我们添加的实际上是一个object,所以这个位置呢,你还不能写成student啊,这个咱们讲下一章呢叫泛型,讲泛型的时候呢,我们就可以呢,去限制这个集合中添加元素的类型啊。比如说我们只让你放student,这个时候你再取的时候呢,就是student。啊,这个咱们下一章呢,到时候讲这个事儿啊好这个呢,我们就还是一个S了,然后打印的话呢,我就直接去这样写了,你同说诶这样靠不靠谱。靠谱,这个我们叫two林方法是吧,虽然你看到的是object。
23:02
其实他还是个学生。也就是说这块呢,实际上还是一个虚方法调用是吧。啊,或者叫虚拟方法调用啊,这呢其实没问题。啊没问题,行,这个呢就完事了啊,咱们呢就可以呢,给他去做一个run了。诶执行起来,所以呢,诶我们选个一啊,就继续录入啊,输入学生姓名。啊,张三。封吧。啊年龄啊,比如说这个99了是吧。哎,继续这学生是吧,年龄有点大啊,继续录入啊是。啊,行,乔峰。哎,这个呢,年龄这个好像也不小了是吧,30。好,结束录入,选个零,哎,走起,哎,这就出来了。诶,所以这块你看调的这突资人呢,还是咱们学生的这个投资人方法啊。行,但是你要说看着有点别扭啊,那那你愿意要转的话,你就在这块提前做一个。强转也行是吧。A student。
24:01
啊,这个STU啊,在这呢,我们alt加个回车做一个强转也可以,然后这个呢,你就STU咬一下也行。这是他。好,前面的话呢,这就我们哎提供了一个容器啊,这个呢,我们是哎。通过。循环的这个方式啊添加。哎,多个啊,这个学生的这个信息啊就可以了啊好,这道题的话呢,我们就说到这儿了,以前的时候呢,我们可能呢,需要用一个数组,而且当初我们在造数组的时候呢,只要你这块你有数组了,一定要指明这个长度。啊,而且你这块呢,你还不能超过这个长度,现在的话你不用管啊,你造完一个类以后呢,底层是个数组,说数组长度是多少,它肯定是有长度的。只要是数组呢,一旦它初始化长度就一定是确定的,但是具体是几呢,其实你不用管。啊,就想感兴趣指导一下,指导一下,那就告诉你一下。啊,看这还不行了,你就看这,我们把光告往这一一放,这话继续说了,说构造一个空的list呢,它有一个初始化的容量呢,是十。
25:03
那也就是说我们这个数组的长度呢,它是十。OK啊,那那当然我们往里放的话呢,你可以一直的点这个继续录入,如果超过十个了,没关系,它会自动的底层呢给你新造一个数组,然后把原有的元素呢给你放进去,你只管呢往里边添加就可以了。诶,所以说白了哈,就是我们这个呢,大家就可以看作是呢,针对于数组的常见的一些操作呀,给我们封装了一个工具一样。以前呢,我们自己呢,用数组添加删除是吧,咱们讲这个项目的时候呢,是不是我们删除啊,插入啊,都得自己做嘛,现在不用了release呢,相关的一些方法,这不都给我们提供好了。增删改差差长度便利是吧,哎,直接你调这个方法就可以就很方便了,就。这着是咱们的第一道题,然后接着我们来看这个第二道题啊。第二道题呢是这样的,说呢定一个方法啊,这都给我们写出来了,说呢统计集合当中指定元素出现的次数,这呢是一个集合指定的某一个元素出现的次数。
26:03
啊,这个集合里边呢,要求放入30个小写字母,随机放的。统计一下ABCX出现的这个次数,效果如图是这样的。诶,上面呢,就是我们放到这个集合当中的很多的这个字符啦,然后呢,统计一下呢,出现了几个。诶这个意思哈,那这个题目的话呢,主要的这个,呃,编写其实就是两个过程哈,第一个呢,我们需要呢造一个。集合类是吧,里边呢,随机呢,放入30个字符。啊,像这个随机怎么体现啊呃,这个完了以后呢,接下来我们去这个集合里边呢,找指定次数出现的次数。啊,然后对应的方法呢,已经给我们声明出来了。哎,就长这个样子。来,我们看怎么去做。那这个呢,我们称为呢,哎,就叫做一个list的一个测试吧。这样啊,好,没方法。进来。诶,这呢,就是我们刚才说的这个需求一。
27:00
啊,这个随机。哎,生成哎30个字符,然后呢,存放在。哎,我们这个叫A历史当中。诶,这呢是我们第一个需求啊,然后诶第二个需求。哎,需求二啊,然后呢,就是电力。啊,这个我们说呢叫A啊,然后呢,查找指定的元素啊,出现的这个次数。哎,就这样一个过程。好,那我们首先来看第一个需求啊,既然呢要放在release当中,那把release呢先造出来。哎,就这么着啊,有了它以后呢,我们正常来讲呢,往里去添加了,添加了要添加30次方,那我就写个循环得了。list.i是吧,这个I的时候呢,这块我们就要小心了啊,咱们现在添加的话呢,这个呢,就是咱们添加都是这个小写字符吧,比如说啊小写的话呢,就是从A开始一直到这个Z是吧。
28:03
啊,还得体现这个随机性啊。这怎么整?对这块呢,其实我们就可以怎么办呢,诶我呢小A是97是吧。实际上呢,我们就相当于找指定范围的一个整数,你再给它强整成个差不就行了吗。对,97这占到多少。加多少?应该加上20。五。对啊对,加上二十五幺二二是吧。对,我就找这个范围的一个,呃,整数就行是吧,然后把这个数呢,我们再做个强转就行了,你同学这个是122吗?为啥加25呢?一这样想啊,从零到25。这是一共不就是26个。是吧,诶然后这个呢,差值是25,所以呢,这个你一减的话,这不也是25吗。OK啊行,那这一块咱们先把这个随机数呢,先比如说整出来啊,这个呢,咱们讲过点方法,也讲过这个这个类的这个next in的方法是吧,都可以啊都可以,假如我们要用这个的话。
29:04
嗯,这呢,就是这A至B是吧。它呢,去乘以一个。叫B减A,咱就122减去97加个一是吧。然后呢?在这呢,我们做一个强转。哎,然后得到这个结果呢,再加上一个。97是不是就可以了。好,这个呢,就得到这个数了,那这个数咱们就直接给它。CTRLX,我就往这一放吧。哎,这么着是吧,对大家说的对啊,这时候你看我没有强转啊,没有强转的话呢,如果回到这个位置,咱们先简单的看一眼这个list。来,我们做一个执行。你看显然不对是吧。哎,这个时候呢,它还是一个具体的数呢,我们得需要呢,给大家强转一下啊。想转怎么着?变成叉是吧。变成叉的话呢,这块是一个int啊,我直接这块呢,你想给他写个叉。
30:04
嗯,这个我们先走一下。也不行是吧。啊。怎么着这块你看啊,我是给他强转成是个叉了是吧,我这个扩的是。括到哪儿了,这个小括号是括到这儿的是吧,加上97,所以这个不靠谱是吧。怎么办?你看我能不能把这个括号我括到这儿。回到这儿呢?找一下。哎呀,既然行了是吧。哎,就是我们刚才呢,扩到这块的时候呢,它其实算的是个差,然后呢,跟97做运算了就in特了是吧?诶往这样一扩呢就行,但是这时候你注意我们添加的这块呢,算添加的是一个什么呀。包装类是吧,它跟我们这块艾的时候呢,你看这里边儿我们加个引号这个小A,那这时候也不报错是吧,这个呢,相当于怎么着了。
31:00
自动装箱了是吧。OK啊,那这时候呢,意味着我们其实呢,是character的实力了是吧。嗯,那但是这块呢,你看我们这个方法啊,我这块写的是一个string了啊。那所以这块你要回过来呢,咱不行就。给他这么着一下得了。把它变成字符串。哎,来处理字串,呃,也建议呢,大家这块操作一下,为啥呢?因为这个差呢,你整不好的话呢,万一要是诶我们又拆箱了,又做一个加减乘除了它就当个数去算了是吧。所以这块我们加上这样一个符号呢,稍微的好一点啊行,这个呢,就是我们目前的这样一个操作,诶第一个需求呢,咱们就搞定了,那就这样,然后接下来哎,这儿呢,需要提供一个方法。啊,回过来另一个他。Can。啊,回过来这个我们就定义在这个酶方法的外边了啊。诶,就这么着了,说呢,这是一个声明成collection了啊,也没问题,诶我们现在要判断这个字符串在这个list当中啊当中是吧,名叫例了啊,出现了这个个数了啊,就先定一下这个count呗。
32:04
比如是零个是吧,就放循环吧。或者用迭代器是不是都可以?啊,没问题啊行,这会用增加for的话呢,这就是object OG冒号一下叫list。然后呢,这个呢,就是里边的具体的这个元素了,我们这个S呢,去调这个E库的方法,然后跟那个OB be呢,你看一下是不是相等啊if。哎,如果呢,他这是一个处。哎,那我们这个抗呢,就加加一下,哎,如果要不是处,那就接着取下一个。就完了是吧,然后呢,在最后我们去return一下这个count是不是就可以了。啊,这呢,就我们这个叫需求二。诶放到这儿这类方法呢,它是一个静态方法了,所以呢,我们直接呢,可以在这块呢进行调用。啊,然后叫他把我们上面这个例子呢放进去,他呢需要去计算的,呃,提到了有这个。看这啊,ABCX。行,那回过来这块我们就写个A。
33:02
诶,然后呢,返回接收一下,这个就是A的一个count。啊,类似的,我们再整几个其他的啊。BC。和这个X啊。哎,这样就可以了啊好,这块我们打印一下啊,说这个就直接这样A冒号吧,加上这个a count。多了一个。BCX。哎,这样就可以了,好,然后呢,我们去做一个。哎,这就出来了啊,这个呢,不行,你就数一下。你看对不对是吧,行,其实呢,应该是没问题啊,好这道题呢,我们就做到这样了。啊,大家下来呢,也可以自己呢写一写啊,哎,这个呢是我们的第二道题,然后这个第三道题的话呢,这个我就不打算这个写了啊,咱们大家呢下来呢可以写一写,然后这块呢,我把这个诶答案呢放到这儿了,咱们稍微的剖析一下,诶大家下来写就行啊,这个题目呢是这样子的啊。
34:08
诶,这个呢,可以对应的叫KTV的一个叫点歌系统。啊,我们直接呢,就把它跑起来。应用起来以后呢,它是这样个效果,说当前的歌曲列表已经呢,有一些这个歌了。哎,这个呢,我们就放在这个early当中了,咱就一边说呢,一边给大家去做一个剖析,其实呢也不难啊,里边呢就是用一些的几个方法就行了,哎,这个怎么做呢?酶方法一进来,咱们上来这块呢,其实呢就是添加集合,添加元素到这个集合当中。啊,所以呢,这个方法呢,点一下。哎,就是我们上面呢,这不已经提供好了一个属性,就是一个list。然后呢,我们调这个方法的时候呢,哎,就往你当前的ari里边呢,加几个歌就完了。好,加完以后的话呢,这我们在main方法里边一上来,这不就把这个添加完了,添加完以后的话呢,我们这有一个Y处,这跟咱们以前写那个项目的思路是一样的啊,他这不也有一个呢,要退出嘛。
35:04
以前咱们写前面几个项目都是这个思路,当你选四的时候呢,我们就把这个flag呢给改一下值就行。那么这个接着说啊,嗯,这块一进来以后呢,这块当前歌曲列表,这个其实呢,就把我们这个集合里边这个元素呢,就显示了一下。哎,就是这块这一行就是这一行。就比较简单是吧,好下边的话呢,它就把这几个选项呢,给我们列出来了,让我们哎选一个其中的数,那我们要选一的话呢,这叫添加歌曲值列表,比我们这块就选个一。啊,选一的话呢,它调的就是这个方法了。这个方法呢,要做的事其实呢,就是我们自己输入一个字符串,然后把这个呢做一个歌名添加到我们现有的这个a release当中就可以了。说一天家。是吧,也比较简单,比如我们想点一个。啊,最伟大的作品啊,这是周杰伦的是吧?
36:02
行好,这个呢,我们一回车这个呢,就添加成功了,这时候呢,他就又重新这个做了一个外部处的一个循环,这不就添加到末尾了吗。那上面这块也会说一个说啊已添加格局啊,这就它。啊,其实比较简单啊,好这块又提示我们去做一个选题啊选择啊这块呢,比如我们选这个二。选例二的话呢,一走这个呢,就将歌曲置顶,那我们就调到这个方法啊一点。就是现在呢,你去选一下,目前呢,我们有这样一些歌,你选一个歌,你想把谁置顶。是吧,就这个需求,这里边儿呢,完全有可能我写的是错的,比如这里边儿你是我的眼啊,写成那我是你的眼是吧。写错了啊,这个我一整还有提示呢,说哎当年列表动没有这个歌。是吧,哎,那比如说这块呢,我们想置顶啊,哎,我还选一下这个二。这时候呢,诶,我就写了个本草纲目,其实本草纲目已经是置顶的了,是吧。哎,本草纲目是吧,哎,写完以后呢一走,他说呢,诶,当前歌曲默认已经置顶了。
37:06
哎,你看这些呢,都有一些要求是吧,呃,那要是随便呢,选一个后边的老男孩。诶,洗完之后呢,我们一回车。画了是吧啊,他让写序号呢是吧?啊重来一下啊,别激动了啊啊先选二哈。啊,这个选歌取名啊老男孩。哎,老男孩是吧,好啊,一回车这块呢,你看他把这个老男孩就放到这个开头了,这就叫置顶是吧。来这个操作怎么做呀。想想。哎,这块你看这样处理就行啊。呃,首先呢,从键盘获取,你要置顶那个歌名。这歌名呢,咱们也发现了,你可能写的不对是吧,所以呢,我现在去当前你这个例子当中找一下。
38:02
哎,所以这个找的话呢,咱们也有个方法叫index of啊。咱们那块提这个方法的时候呢,同学没印象了。哎,我们在这里边儿呢,上边是不是有个index of。还有啊,好,回过来。啊,这个我们找到这啊,诶我呢找你这个输入的这个歌呢,在我们当前这列表中的一个index啊a index要小于零的,就相当于没找着呗。是吧,如果你index就是零,那就说明你已经置顶了是吧。好,那如果说它也不是零,是大于零的个数,那说明找到了,而且是后边某个位置的格了,我现在要置顶怎么做。比如说就以他为例吧,现在我就想把这个你是我的眼置顶咋整?对。先把它先删掉是吧,删掉之后呢,再加到。第一个位置就行,哎,所以说这块就这样先水木掉,第一个位置呢,不就是角标零的位置吗?这就是个插入的一个操作,然后呢,已将它置顶了。是吧,哎,这个呢,其实不太难是吧,好这呢是我们说的这个第二个,接着我们看这个三。
39:03
三大说将歌曲前移一位。啊,前一位啊,你想把哪个歌前一位啊类似的,目前我们现在这个歌曲列表是他了哈,嗯,比如说这个,嗯。还是你是我的眼吧,这个又写错了。我是他的眼是吧?哎,你写错了是还是说呢,没有。啊,这没问题,然后三是吧,再进来这个呢,老男孩。哎,把它呢,往前移位,那其实也移不了了,它本身就是头部了是吧,这边再说说已经是在最顶部了啊哎,只要呢,不是第一个,后边这个都行,比如来一个爱你吧。是。哎,这个是吧,哎,王心凌的哈。好,这个呢,我们就把它前置了一位,你看真正不就变到这个位置了吗。行,那这个怎么做的呢。哎,我们调的是嗯三这个方法呗。哎,首先呢,输入你要前置这歌名还是叫in so,小于零,说明你写错了啊,零已经置顶了。
40:06
呃,已经在这个顶部了,没法再前置了哈,然后呢,否则的话。哎,我们把它呢,想往前前置一位。还是先删掉是吧,删掉之后呢,前置一位呢,就是原有的这个索引呢,再减一个一。不就前置一位了吗?就没了是吧,诶这个第四个叫退出这个事儿呢,咱们不是之前都这样做吗。诶,当你选这个四的时候呢,我们只需要把这个波尔类型的变量呢改一下就行是吧,然后呢,这个well呢就推,诶well呢就退出这个循环了。OK啊,行,这道题呢,我就。咱就不写了啊,哎,这个大家呢,下来有兴趣呢,你把这个题目呢,可以做一下,这个呢,对应的就是我们这个历史呢,相关的几道课后练习题,OK啊。嗯,然后呢,这块这不还有一个呃interview啊,这个呢,其实咱们那会儿讲相关的方法说呢,把这个事儿呢已经说过了啊,但这呢是一个release加了个123,实际上这都是自动装箱是吧。诶自动装箱啊,都是以inte的方式呢去呈现的,然后呢,这个update这个例子呢,里边呢,我们对它进行一个操作,这个呢叫写了个二。
41:08
这个呢?先认为是一个索引是吧。哎,对的啊,所以打开这块,你看它其实掉的就是index了啊,所以这块我们把这个二呢删掉之后,留下来的应该是。一二是吧。走起。诶,你看留下来是这个一二啊,所以呢,他删的是这个索引二,小心一点,那我怎么呢,让他去删除这个,删除这个二呢。对,咱们也提到过了,这个你把它呢,显示的包装成是一个integer就行了,是吧,这个我们就调这个,呃,Integer点叫Y6OF,你把这个二放进来,它这呢表示的就是一个对象啊,这个尔的对象,这个核心的值呢就是二,其实呢就把它给删掉了。啊,这块我们去做一个run。一三是吧。好,那如果我这个我写的不是二啊,我写的是128。
42:00
这是128。还能把这个128删掉吗?对啊,这又又拿了一波是吧。嗯,这个呢,有啥区别呢,就是我们有同学会想底层的有一个,诶那个in catch是吧,诶负的128,哎到正的127啊,你这写个128说这就找不到了,没关系,你这个自动装箱呢,其实是自动是new的一个。不是用的这个范围的是吧,然后这块也是new的一个,但是我们删的时候呢,我们不都是用的echo的方法嘛,所以仍然认为有你是吧,所以照样呢是能删除的。啊,没有问题啊。哎,这个只是我们就稍微的又变了一下啊,恶心一下大家啊。好,这呢,关于我们这个例子呢,咱们就告一段落。
我来说两句