00:01
好了同学们,那么今天上午呢,咱们其实也没讲太多的东西啊,就是理论上的东西比较多一些啊,就是把这个collection接口当中的方法,List的接口当中的方法,它特有的方法讲了讲,Release的底层是一个数组,对吧?这个之前我们已经讲过了,所以呢,这个数组它的优点,它的缺点是什么?我希望下去之后呢,大家再思考思考,想一想,数字的优点为什么是查询效率比较高,随机增删原图效率为什么比较低,而release的集合它呢?诶,它那个为什么检索效率高对不对?哎,它为什么随意增删效率比较低啊,在最后的位置上增加元素,为什么效率就高一些是不是,哎这个呢,大家要去理解它。那么也就是说list的集合更适合于什么呀?适合于我们这个检索的情况比较多的这种业务场景啊,你比如说你将来写开写这个代码的时候,发现这个我们这个频繁的再从这个呃,集合里边干什么去查找元素,那么这个时候呢,你显然是需要选择list的这个集合,而不是link list。
01:02
啊,那么今天上午呢,我们在最后给大家讲的是一关关于一个link的list子的这样的一个集合,这个集合的底层是一个链表这样的数据结构,那么链表这个是双向链表是不是?哎,双向链表,那么我们今天上午在讲解的时候,我们最后讲到一个单向链表啊,我不知道大家有没有听懂啊,这个单项链表的这个数据结构还是比较简单的啊,比较简单的,那么我们可以再看一下吧,再看一下啊,然后我们回来。我们在课堂画图这块吧,应该是有个链表,是不是我们把它列表打开,这就是那个链表,各位啊,这就是那个链表,这个链表当中最基本的单元,我再强调一下是一个什么呀?是一个节点,那么这个节点留两部分组成,一部分是数据,就是你将来数据存到哪,存到这个节点上,然后呢,这个节点还有另外一部分就是下一个节点的内存地址,你下一个节点这个对象的内存地址在我上一个节点当中保存着。啊,保存着,那么这个是单向的各位啊,单向的是从头往后找啊,你通过后面这个节点找不到前面这个节点,明白吧,你通过后面节点是无法找到前面节点的,这是单向链表。
02:12
啊,单向链表。那么在这里呢,其实我也嗯尝试着去写了一个这个类似于什么链表的一个东西,对吧?哎,单链单link啊单链表,那么这就是链表是不是,那么里边呢,有一个什么呀,有一节点呗,只有一个头节点就行了,因为我们只要有头节点,我们是不是就可以根据头节点找到第二个,有了第二个我们是不是可以根据第二个找到第三个,有了第三个可以通过第三个找第四个,第五个找到第六个,那么链表这块它的优点是什么呢?其实就是随机增加或者是随机删除某一个元素的时候,我们效率比较高一些,因为它它在删除或者增加某个元素的时候,它不会涉及到大量元素的位移问题,因为链表上节点它存储在空间上是不规则的,它不像数组是排好队的,一个两个,三个,四个,五个是不是排好队的,在空间上存储是内存地址连续的,那链表呢,它在空间存储上,它的内存地是不连续。
03:12
只是一个混乱的对吧,只是一个节点中保存一个内存指向了这个对象,这个对象的保存内存就指向这是这个对象,所以它的检索效率就比较低一些。查询,查找某一个元素的时候,它是不是只能从头几点挨着往下找?这就是链表,它的缺点,在查找的时候效率比较低,但是它随机增删,增加一个元素或者删除元素,不涉及到元素位移问题,所以它的增删效率就高一些。啊,那么大家思考一个问题,这个链表有没有下标?我们可以让他有下标吗?就是我们这个链表当中的存储的这个数据,可不可以让他有个下标。我们在这加一个属性,就加个下标属性行吗。可以吗同学?所以在今天上午最后的时候,同学问了啊,说老师那是不是因为这个数组啊,它之所以效率高,是因为有下标。
04:07
我这个link list就没有下标不是啊。这个list的集合下边有这么多分支,List的存储元素的特点是有序,可重复,有序指的就是有下标,所以它有它有它有它们都有下标,这这边没有啊,错了,这边没有,就这个这个这个他们都是有下标的啊,有下标并不代表他能快。明白吧,有下标不代表它能快。就这个release的,之所以快是因为有下标吗?不是啊,是因为release的这个集合呀。它底层是数组,数组它的优点所决定的,它检索效率比较高。说它也是有下标的啊,也有下标。对,有同学老师,他怎么会有下标呢?我们去新建一个class,我们叫link test01。最大化之后,我们看一看list list new一个什么呀?叫linked list。
05:03
用完这个之后呀。什么情况list,然后呢,List呢,你一个什么叫link list这个集合。用完之后呢,我们list调I的方法往里边加A,对吧,List调I的方法往里加B,然后呢,List再调I的方法往里边加C。是吧,啊,那么这一块呢,我们对它进行变利for循环,In类型I呢等于零,I呢小于这个叫做list角size I呢干什么要加加那每循环一次呢?我从这例子调钙的方法加标为I的元素给它取出来。然后把这个元素给它输出,我们执行一下,好,大家看这个是不是就根据下标来获取的呀,这底层是不是link link list的呀,有没有下标啊,有啊,所以大家注意,Link list的这个集合底层也是有下标的啊,Linked list的集合底层也是有下标的啊,有下标的大家一定要注意啊,注意。
06:01
这个之所以检索效率比较高,是不是不是单纯。因为下标的原因啊,是因为底层数组发挥的。发挥的作用啊,是因为底层数组发挥的作用,Link the list的集合照样有下标,但是检索或者叫查找某个元素的时候效率比较低。因为只能从头节点开始找。开始一个一个便利,只能从头节点开始一个一个便利,明白什么意思吧,哎,所以说这个是我们这个link的list这个集合啊,就这块呢,我写上吧,链表的优点,链表的优点,链表的缺点在这再写一下优点是什么?优点是由于链表上的元素在空间存储上内存地址不连续。
07:18
啊,内存地址不联系,所以所以随机增删元素的时候不会有大量元素位移啊,因此随机增删效率较高,在以后的开发中,如果遇到什么呀,随机增删集合中元素。集合中。元素的业务比较多时。建议。使用。Link list。在以后的开发中,如果遇到随机增删集合中元素的业务比较多的时候啊,建议使用link list。
08:03
啊,这是它的这个优点,它的缺点呢,缺点是不能通过数学表达式计算啊,被查找元素的内存地址,每一次查找都是从头节点开始,便利。直到找到为止。直到找到为止啊,所以link的list的集合啊,检索或者叫查找的效率较低。所以没有一个东西是完美的list集合。当中的a list和linked list这两个集合是非常具有代表性的。一个是数组,把数组的这个特点发挥到极致,一个是链表,把链表的这个特点发挥到极致,对吧,你一个东西不是那么完美的,因为你在这方面优越的话,你在另外一方面你可能就比较差一些,对吧?哎,那另一个的例子的呢,它可能在什么呀,在我们随机增删上面发这个效率方面发挥的比较好一些,但是它的检索效率就比较低一些,而呢,在我们的一个检索方面发挥的效率非常非常高,但是我们的随机增删元素的时候,我们这个效率比较低,还好是什么呢?以后我们一般加元素啊,都是往什么呀,往末尾添加。
09:36
所以aist用的。比谁呀,比link list多明白什么意思吧,就A把什么呀,把检索发挥到极致。啊,发挥到极致啊,这个是把什么呢?把随机增删发挥到什么极致,对吧?哎,加元素往往都是什么呀,往末尾添加啊,所以说用的比这个link子多一些多一些,这很正常啊,正常来。
10:13
末尾添加元素啊,效率还是很高的啊,还是很高的,所以这个多啊,这个用的不多啊,相对来说这个多一些啊多一些。那之前我觉得应该再补充一点,在test list test01里边,我这块我再加一点各位啊,List是非线安全的,这个事我要提前跟大家说一下啊。List的集合是非什么线程安全的啊,它不是线程安全的,不是线程安全的集合啊,这件事儿我忘了啊大我写到这儿大家记一下啊,记一下好了,那么这块呢,咱们上午呢,说到这个链表,单链表是这个德行对不对,然后呢,这个程序我就不再往下写了,各位啊,你下来之后,你有兴趣呢,你就往这个呃,自己写个程序实现写链表呗,对吧,只不过这个链表是个单向链表吧。
11:08
对吧,你要有有兴趣你可以弄一下啊单项链表啊,实现一下,你往这个链表上加一个元素啊,哎,干什么呀,删一个元素啊对不对,哎,改一个元素啊,查找一个元素啊,哎,可不知道大家有没有去,有没有这个理解,为什么这个方法是私有的。因为我为为什么要把这个方法定义成私有方法,因为我这个方法是不希望什么外部程序调用我这个方法,只是我当前我这个类里边需要使用你这个方法的时候,对吧?这个方法不不对外部公开的话,你可以加一个private进行修饰,这样的话,这个私有方法在外部就访问不了了啊,访不了了。
我来说两句