00:00
好了,同学们,那咱们就开始接下来上课了啊,我问大家一个问题,就是到目前为止我讲的虽然多一些,但各位思考一下,我们讲的多,但是代码多不多?就代码多不多,你觉得。各位就讲的唠嗑唠的多。代码多吗?其实都是在讲数据结构呗。是不是在讲数据结构?听明白是吗?哪块听不明白,就是那个,呃,那个什么听不明白呗,就是主要是这个内存图是吧。就单链表,单链表是怎么回事,双向链表是怎么回事?就是这个数据结构,大家理解吗?就在这画的这个单向链表,长这个德行。啊。双向链表长那个德行?就是链表有有没有。
01:03
内存图理解了。就代码还没理解是吧,代码的话你下来之后这样吧,咱们不要求所有学生都会代码啊,这个代码这一块的话,你尝试看源代码吧,能看懂就看,看不懂就算了啊,看不懂就算了。尤其这个link list,这个内存图是怎么怎么一步步变的。源代码可能是确实是稍微有点难啊,你自己看吧行吧。双向脑子糊了双向这块。嗯,就就这么一个图呗,是不是啊,就这样一个图,我一个节点里边保存内存地址,指向上一个节点,我一个节点里边保存内存地址指向下一个节点,我有一个数据是不是?哎,上个节点内存地址和下个节点内存地址都有。啊,然后呢,我整个这个link list里边有两个属性,一个是first,一个是last first这个变量里面保存第一个节点内存地址,Last这个变量里面保存什么。这个最后这个节点这地址啊,是这样的,双向头节点,头节点这个是钠啊,然后末尾节点这个是捺,对不对啊,这是钠。
02:07
这双向链表啊。就总之咱们这个不管是双向的还是单向的,总之咱们。Link link的创建不都是双向的,双向的啊。创建的时候怎样区别单向和双向呢?底层不是底层是双向链表。这个底层是双向的,不能创建单单向单向的啊,这个拗出来就是双向的。这个link的list出来就是双向的。不能创建单项的,你要单项列表的话,你自己得得自己得写。明白吧,自己得写一个单项的,你愿意使用双使用单项的,你可以写一个。嗯,就是自己得写一个类似于这个link list的这种东西,写写出来就行了啊。好了,那么接下来呢,咱们来看一看什么呢?再往下的话,准备实际上是往下就是关于这个set这一块了,是吧?哈,Set还有sorted set追set是不是啊这块的内容,但是呢,我们先把这个泛型说一说,各位啊,先把泛型说一下。
03:14
来collection集合这块啊,我们去新建一个class,我们叫做。TEST01注意啊,泛型JDK5.0之后。叫JDK5.0之后推出的新特性。反型。发型。我们来看看不使用泛型啊,先不使用泛型。机制。分析程序存在缺点。行吧,哎,分析程序存在缺点啊。呃,我们还是用一下我们这个比较。用的比较多的例子啊,比如还是有一个类叫做animal。
04:04
然后呢,有一个类叫什么呀,叫做这个cat去继承谁啊animal。然后呢,还有一个class叫做dog,去继承谁啊bird吧,鸟儿啊,还是这个bird比较熟,这个是不是继承谁呢,继承animal,然后呢,在cat里边呢,有一个方法,各位啊,这个方法呢,我们叫做cat。叫做catch mouse。然后我们输出一句话叫猫抓老鼠,下边这个呢,我们有一个方法叫FLY。比如说public void。FLY来,我们说出一句话叫鸟儿在飞翔,叫做鸟儿在飞翔。很简单啊,那一个父类,两个子类,然后接下来我们在这里呢,去创建一个list集合里边我们先不用泛型各位啊,来,我们先给它引进来,引进来啊,然后叫my list等于new一个A。
05:12
好溜完之后呢,接下来我们准备什么呀,对象。准备啊,对象怎么准备呢?比如说这个cat c呢,一个cat出来。然后呢,Bird呢B呢,又一个bird出来,好,准备完对象之后呢,将对象添加到集合当中,怎么加呀?My list.i把谁呀C加进去对不对啊,然后紧接着呢,My list.i把谁呀,把B加进去,那这个地方是创建集合,这个地方是什么呢?是准备对象,这个呢是加进去,接下来我们要求什么呀,便利集合啊,取出K。让它干啥呀?让它抓老鼠啊,取出bird。
06:05
让他来,让他飞啊。对,让他飞。那我这个遍历该怎么便利啊各位。怎么便利啊?迭代器吧。我那个list的集合嘛,准备俩对象放放,放进去了吗?放进去我便利集合嘛,我想便利集合,从集合里边取出这个猫,我从集合里边取出这个鸟,取出猫我就让它抓老鼠,取出鸟我就让它飞。是不是啊,很简单的类型,Animal父类子类继承父类子类继承父类,那现在我这个animal可能没用没用上,没关系,来我在这儿是不是可以用迭代器啊。对吧,这不迭代器吗?迭代器啊,拿到迭代器怎么拿呀,上面调这个集合它的一个方法,什么方法呀,迭代器这个方法,拿到迭代器之后呢,对它进行循环是不是哎,循环has next。
07:04
嗯。如果说我们有有的话怎么办呀,在这调next的吧。对不对,哎,返回一个什么呀,Object呗。是不是啊,返回object。这是OBJ,那接下来这个同学该怎么写啊这个程序。怎么着?OJ。Instance。怎么写?我不写了,你思考吧,这个成绩该怎么写?你现在不是拿迭代器吗?循环迭代,拿出元素吧。拿出这个元素,然后呢,你让这个元素去抓老鼠呗,抓呗,能抓吗?Catch mouse是抓不了啊。对吧。
08:07
直接animal。什么叫直接animal?直接啊。这样写,这样写,报错了呀。写不了。就不使用泛型分析程序存在的缺点。Cat bird cat加进去,Bird加进去。如果他是这个类强啊。行,这样我觉得再加一个方法吧,各位,我在这加一个方法啊,Move。
09:01
行吧,就输出一个,说一句话叫动物在移动。对,我就先简单点,别别整那么复杂啊,看这个有个子类去继承父类,子类呢去继承父类,这里呢有一个特有方法,这是特有方法吧,特有方法是不是,这是不是也是特有方法呀。特有方法吧,哎,这是不是复利方法。福类自带方法是不是啊?然后这样吧,我这也别让他去抓老鼠,也别让他去飞了,我说便利集合取出每个动物,每个animal。啊,让他干啥呀,让他move怎么写,各位。我就让他掉木吧,掉木吧,别去抓老鼠了,也别去FLY了,就在这,假如说木,应该怎么做呀?你是不是eat.next的这个方法现在没有用泛型,所以你取出的这个数据是不是就是object呀?你举的是object对不对?哎,那有的人说老师我现在能不能直接写animal,不行,报错了呀,对吧,没有这个语法,哎,没有这个语法啊,没有这个语法。
10:06
通过迭代器取出的就是object对吧,通过迭代器啊。取出的就是谁啊object,所以这块呢,你只能怎么着呢,写这个object。只能写object,那么这个时候呢,问题就来了,OBJ里边没有那个木方法,OBJ中没有什么呀木方法。无法调用,需要向下转型是不是,那你向下转型,那你没办法了,就判断一下呗,如果OB这obj instance of,它要是一个animal的话,我们是不是才会转呀,对吧?哎,Animal a等于什么呀?Obj前面写一个什么animal就行了。那这样就转型了吗,对不对。都一样。不可能。你写这个肯定不行啊。
11:05
报错呀,你那个怎么能行呢。你是不是在这加强软了。文杰,你是不是加强暖了?OBJ,你你你现在我现在提议我再说一下啊,我是不先不用泛型分析一下这个程序这样写有什么样的缺写缺陷缺点我们改进一下啊,然后呢,List集合new,一个NEW2个对象出来,放到list里面,拿到迭代器,然后对它进行循环,哎,有的话取出元素,取出object,然后你调木能调吗?你调不了啊OB这点木你怎么move啊OBBj.OB。对。木,你能木吗?木不了,这个木方没有奥,里边没有木方法,你用不了。
12:02
所以呢,我取出这个object之后,如果是一个animal我就转型嘛,那这样的话,我是不是可以调a.move啊。是不是?那运行一下。动物在移动吗?没问题吧?是没问题。哎,代码这样写没问题,好大家注意看啊,我用一下泛型。我用一下行各位啊。还是这个程序听懂了吧,还是这个程序我用一下行。大家注意看。使用JDK5之后的泛行机制。来我们看看啊,这个list的集合,或者release的集合,它在new的时候啊。往上看啊,这个release的集合,这边是支持泛型的。
13:02
永老师这个泛型是个什么东西啊,哎,比如说我们在这呢,写一个东西啊,写上什么呢,写上去。Animal你看啊,有这种语法,前面加一个什么呀,Animal这是什么意思啊,就说明指定使用泛型,使用泛型。List加括号啊animal之后表示list集合中只允许存储什么。Animal类型的数据,其他类型不允许存储,你比如说my list,调I的方法,往里面存个字符串ABC。你看他报错不?鼠标停到这儿你看。是吧?提供了一个字符串,但需要的是一个animal,看见了吗?你就不能往里面随便放了啊。是不是集合中的类型更统一了?用泛型来指定集合中的数据类型吧,哎,用泛型来指定集合中的集合中存储的什么数据类型?你指定animal就不能存词缀啊,指定list集合中只能存储什么?
14:17
Animal,那么存储string就编译报错了。这样用了泛型之后怎么着啊,集合中的数据类型。集合中元素的吧,数据类型更加统一了,更加统一了,那你my list对吧,你往里面存啥呀?存一个animal,那你现在你new了一个bird new了一个cat出来,准备好了这两个对象,然后接下来调manage list.i的方法,能不能存一个C,能不能调manage.i方法存一个B进去啊。没问题吧?是不是因为你的K和bird是不是都是annual这个类的子类?
15:05
对吧,哎,Animal的子类啊,那么接下来我们在这里是不是进行获取迭代器呀。这还是那个历史集合啊。这是那两个对象加进去了吧,迭代器迭代,那么这次迭代的话,大家看my list调用eer这个方法返回一个什么迭代器。好,大家看那个帮助证特支持不支持。支持不支持泛型?去。凡是带着间号开始到间号结束的,就代表它支持泛型,各位就我们以后在编写我们程序的过程当中,我们这块到底能不能用泛型呢?能不能用JDK5.0之后的新特性呢?我们要看人家这个原代码,你点过去看看这个类型后边有没有加他,如果加他了,表示可以用泛型。你的list呢也可以吧,你的list呢,是不是也可以呀,都可以加,所以这块能加咱们就加上去啊表表示这个地方加一个啊加一个什么呀,可以迭代是animal。
16:10
这个表示迭代器迭代的是animal类型。注意啊,你看加了加了这个了,这个时候我们在这块循环的时候,它有没有更多元素,如果有的话,大家这次看这个方法的返回值还是object吗。这个next的方法的返回值是不是一个animal?对吧,所以这一次你是不是直接就拿到了一个animal对吧,然后A点什么呀,Move就行了。使用泛型之后每次迭代的数据,使用泛型之后每一次迭代返回的数据都是什么呀?Animal类型,这里不需要进行强制类型转换了。
17:10
直接调用。哎,你看执行一下。对吧,这个代码是不是要比上面这个代码好看一些,上面这个代码怎么着啊,如果它迭代反是个object呀。对吧,OBJ是这种类型,我们再强转,转完之后才能调方法吗。现在我们用的泛型是说list集合里边存储指定的类型。对不对,哎,然后呢。如果中存在一些不是M怎么办?那就报错呀,刚才讲了呀,你不存了个字符串,报错了吗?不让你存啊,所以这个集合就约束住了,里边的元素不能随便,不能随便存了。
18:05
你看。是吧,不能随便存了呀,你存字符串能存进去吗?存存不进去报错了。对吧,泛型这种语法机制啊,只在。程序编译阶段起作用。只是给谁看的,给编译器参考的。运行阶段意义不大啊,运行阶段。反型没用。范刑是在编译阶段起的作用。编译器看到你这个list的集合里边存的是animal,妥了,你要往里边存一个字符串,你看编译器让你过不让你过,编译器让你过吗?报错了,泛型是一种编译阶段的一种一种特性。
19:05
属于编译期的啊,属于编译期间的。一个特性。使用了泛型有什么好处啊?使用了泛型好处是什么?第一集合中元素集合中存储的。元素类型统一了。第二,从集合中取出的元素类型。是。是泛型指定的类型,不需要进行大量的强制类型,嗯,或者向下转型啊,向下转型。明白吧,泛型的缺点是什么?
20:03
导致集合中存储的元素缺乏多样性。导致集合中与存储的元素缺乏多样性。就泛型它也有缺点,你一旦用了泛型之后啊,它也有缺点,那缺点是什么,你就不能往里边随便存了。你存一个这个存个那个,存个那个存个这个,你存不了了,你只能说你指定一个animal,那么这个时候他将来这个集合里边只能存animal,你存不了别的,你存别的就报错。啊,存别的就报错明白吧,你这样的话有一个好处是你迭代的时候,每一次迭代取出数据不是object了。你迭代器指定泛型之后,你将来迭代的时候,你取出的数据都是什么呀?你看编译编译器吗?编译器一看,哦,Ne方法返回一个什么animal吗?那你是animal,这个时候我们再去直接调就行了,不需要在这做强制类型转换了,或叫向下转型,不需要做了。这就是范进的一个优点。我说一下啊,这个新特性为什么得到得到认可,原因是以后我们大部分情况下,几合里边存的元素类型是统一的。
21:07
就大部分情况,我们集合里边存储的元素就是类型是统一的,要么存,要么放苹果都放苹瓜,要么放西瓜都放西瓜,要么说这个里边放这个甘蔗就放甘蔗,就这意思。啊,所以说大多数大多数的业务情况下啊,大多数业务。中集合中元素的类型还是统一的。啊,所以这种特性啊,这种泛型特性被大家。自我认可啊,被大家所认可。对,你不要以说,哎这个泛型这个东西推出之后,你看这个集合里不能存别的类型的,你看多尴尬呀,哎,其实我们实际开发那就是存某一种类型,不会说你往里边放个苹瓜,再放个西瓜,再放个这个,再放个那个是不是?哎,我们有一点挺好,就是不需要再做强制类型转换,那我现在再问大家一个问题啊,如果现在我想让这个鸟儿飞,想让猫去抓老鼠的话,需不需要再转型?
22:12
需不需要再转型?各位,就是你其实还是避免不了转型。需不需要再转型?如果你想让他去。FLY,他去看抓老鼠的话,是不是还得再转型啊,得转吧。对吧,只是方便了其中某一个环节。如果你调父类的方法,不需要转调用子类,调用子类型特有的方法。还是需要什么呀,转换的。向下转换的啊,如果。Animal取出来是不是?如果a instance of,它是一个什么呀?K,那你还得再转。有的人老师那还不简单吗?那我直接让这个list里边存K不就完事了吗?
23:04
废了,你要存cat,你能把鸟放进去吗?是不是就放不进去了?对吧,这个地方是不是又报错了。那你为了把这个鸟和猫都放进去?所以你这边只能写什么吧。是不是,哎,所以说泛型其实在哪个环节上它是。它是这个显现的这个效果比较好一些,各位。泛型在哪个环节上显现的效果比较好一些?如果你现在只需要的是里边的方法。泛型。它发挥的这个作用还是不错的。你看你这个move方法调的是animal里面的方法吗?是不是,哎,就简单了解这个都了解了解啊,是可以的,C cat a去转,转完之后叫X吧,X点。
24:04
Catch mouse是吧?如果现在这个A呢?看instance of,它是一个,那我就转成bird呗。For。A转成波。Bird y,然后Y点什么呀?在执行。嗯嗯。是吧,哎,可以运行可以运行啊,就说这是一个泛型的一个使用,跟大家说JDK5.0之后才有的一个新特性啊,属于编译阶段的一个功能,指定在编译期指定我们集合中存储的数据类型。有一个好处,如果你使用animal里边方法的话,不需要转型,这就是泛型的好处。
25:01
不需要下转型,直接调方法就行了啊。
我来说两句