00:00
好了,那接下来咱们就再往下看吧,同学们啊。呃,我来说一下大家这个在这个微信群里边,我看有同学问这个问题啊。我来接下来演示演示一下这个这个这个布啊,来看一下。这个我看那个有微信群里,微信群里面有有聊这个的是吧,来我们新建一个class,这class呢,我们叫collection的一个零六。啊零六。来就就就这么着吧,啊,就在这个这个这个目录下啊。直接新建这样一个类。 ctrl shiftf12最大化。关于集合元素的remove。嗯。走是这样,我看同学是这样写的啊,说collection collection new一个这个先先引进来啊,New一个什么呀,叫做a list出来啊。
01:03
六出来之后呢,接下来呢,它是创建集合呗,是吧,哎,创建集合啊。然后在这里怎么着,添加元素,加元素的点A加啊随便加。来。加啊点ad。再强调一下啊,这个里存的不是123啊,存的是这个一,这个new in t是不是,哎,这个对象的内存地址啊,来放到了我们集合C当中,接下来我们在这里干什么呀?获取迭代器。迭代器应该叫ER,这个方法返回什么?返回一个E吧,哎,叫做。是不是好,那这个类型我们引进来啊,需要引进来拿到这个迭代器之后呢,我们去对代性循环呗,是不是啊,迭代性循环啊,点has next,如果有的话,调它的next。
02:04
这个next返回一个object,看清楚了吗?注意啊,你不能在这儿返回引梯各位啊。编写代码时啊,Next的方法。返回值类型必须是object。这是它的这个这个这个方法里边规定的,它就定义了这个方法,这个方法反馈是object。啊,你就返回object就行了啊,点next返回一个叫做object,这就是那个集合中的元素。这个OBJ啊,就代表是我们这个集合当中的元素,我们把这个元素怎么输出就行了。来我们走一下,他会去调它的什么to方法吧,是不是你你你不用管它也会掉吧,你里边存的是这个这个in t吧,是不是你T类型。
03:05
是不是啊,那会调调你T20图方法是不是输出就是123本身啊啊来走一个。好,大家看在这里是不是输出123啊,没问题吧,哎,没问题啊,好,这个程序也很完美啊,很完美那。上那个微信群里边同学们说有什么问题呢,是这样。它这个迭代器啊。获取的时候。在哪获取啊,在这个位置获取。他在这个位置获取,大家想想有什么问题。就迭代器如果在这个位置。获取那没毛病。
04:03
是吧,啊,那你如果说获取迭代器的方法,放到上面还没加元素之前就获取了迭代器。此时的迭代器,注意啊,指向的是什么呀?是你没有元素。哎呀。拿到这个集合,集合这块呢,以特这个方法返回一个迭代器。是吧,那这个迭代器呢,大家注意啊,此时的迭代器是指向你原先没有元素的那那个状态的一个迭代器啊。注意啊,注意此时获取的迭代器。指向的是。
05:02
那时集合中没有元素。状态下的迭代器。一定要注意啊,迭代器就是结合,结构只要发生改变,迭代器必须重新获取。这个事大家要注意啊,就Java中有有这个这个这个集合这块有这么一个规定,就是集合结构只要发生改变,叠在一起必须重新过去。有这么一个东西啊,集合只要发生改变,迭代器必须重新获取。你记住就行了啊,集合结构只要发生改变,迭代器必须重新获取。那有时老师我就不重新获取,会出什么问题呢?
06:02
集合结构发生了改变。再迭代。我们看看。这个异常你将会发现。当集合结构发生了改变。迭代器没有重新获取时。调用next方法。是。会出现这个异常。啊。是吧,哎在这儿啊,所以说这块呢,大家注意啊,就是说如果你。集合的结构发生变化了,你迭代器就得在这儿重新获取一下。这个迭代器就好,就好像是一个照片一样,它就像个快照一样。
07:02
那你这会儿拿到的迭代器,这个迭代器其实就是什么呀,就是我们这个状态下的一个对应的迭代器对象。如果你加了元素了,那这个时候再去使用你原先那个迭代器next的时候,就会出现这个异常。啊,这个异常。所以这个呢,我主要。想说什么重点啊?那个就是因为这个原因,那就是因为这个原因啊。小朋友,那就是因为这个原因,知道吧,就是当啊,记住重点啊,当集合的结构。发生改变时。迭代器必须重新获取。如果还是用。以前老的迭代器会出现异常。
08:01
这个异常就是他。啊,小鹏说的是什么呀,说的是这个。他就是不能自已刷。它底层就不会刷的。他不会说。就像,就像你好比问我说老师,为什么int I等于十。那你这个解释不了,它是int类型啊。是吧,I变量等于十,你像int规定是int这么写,就是这么写,它现在它底层就是没说。啊,就是没有刷,我们来看一下collection。C2你有一个什么呀。这个release的集合呢,在这个位置呢,我们调一下爱的方法。随便啊,ABC。ADDF。
09:02
啊,Adx y z。当我们加进去之后呢,接下来我们在这个位置呢,我们去对它进行什么。哎,便利便利应该是拿迭代器是不是。对吧,拿到迭代器之后对待性循环嘛。如果有下一个调用它的next。是不是获获取到我们这个元素啊。对吧,哎,我们输出它这个没什么啊,我们输出就行了,来运行ABCDXYZ。上面的我们先注释掉啊。来。执行。大家看下边这个集合,是不是创建这个新的集合,拿到迭代器之后便利,然后呢,每一个元素给它拿出来,是不是就是这个这个样子吧。
10:00
啊。哎,集合是吧,添加添加添加,然后迭代器,然后便利便利便利。是不是哎这样的,那么接下来是什么呢。接下来我们来看一看啊,就是说在这个迭代的过程当中。如果这一块拿到了这个O。我们要删除元素,那么删除元素应该是通过我们C2这个集合点remove删除这个O。从迭代器里边拿出来这个对象之后,我们删除集合中的这个元素。对吧,大家感觉有没有问题这个。我上面讲过了。删掉这个元素是不是当于相当于集合的结构方式的改变?但是你循环在这儿的时候,是不是迭代器没有重新获取。好,大家看这个删除元素之后,集合的结构发生了变化。
11:04
对吧,应该重新去迭代。但是。循环下一次的时候并没有重新获取什么迭代器。所以会出现什么呀,异常。明白吧,就在这儿呢,有一个集合添加元素,然后拿到迭代器,对迭代器进行循环,通过迭代器拿出对集合进行循环,通过迭代器拿出我们这个元素,然后删除这个元素,当你C2这个集合里边把元素干掉了一个之后。按说你的结构发生了改变吗?我说结构发生改变之后,迭代器必须重新获取。这个迭代器没有重新获取,直接进入下一次,第四上行进入下一次继续循环,然后这个时候再调next,会出现这个异常。就这个异常。
12:00
啊,这个异常。啊,然后呢,我们。去运行。看看是不是这个异常。好,大家看,在我们迭代的过程当中,不能调用集合的方法调用这个会出现这个异常,各位。这个异常就是刚才大家看到的。看到了啊。哎,上面这个情况。重点啊在迭代。集合元素的过程中不能调用什么呀?集合对象的remove。方法啊,删除元素。就你不能这么干。迭代过程中不能这样干啊,迭代过程中不能这样。会出现什么呀,这个异常。一样,跟上面是一个意思,你在这里是创建集合,拿到迭代器往里面加,是不是改变了集合的结构?
13:07
改变了集合的结构。不是一会儿还有别的办法啊,改变了集合的结构,你在下边是不是用迭代器就会出问题对吧?你现在这个集合创建了,往里边加元素,加元素迭代,迭代之后拿出元素删,删了之后结果改变,结果改变之后你们又重新获取迭代器。所以就出问题了。那就出问题了,那怎么办呢?好,大家还记不记得我们迭代ter这个接口里边有一个还next next这两方法我们用过了,还有一个方法。对吧,说从迭代器指向的collection中移除迭代器返回的最后返回的最后一个元素。从迭代器指向的collection中移除迭代器返回的最后一个元素。这个是用迭代器来删,那你说这块用迭代器来删行不行呢。
14:01
使用迭代器来删除可以吗?二点。删除的一定是指向的迭代器指向的当前元素吧,删除的一定是什么呀,迭代器指向的什么当前元素。当前元素啊,删除的一定是迭代器指向的当当前元素。啊,当我们这个Y循环结束之后,大家想一想,是不是就删完了这个集合里边元素的个数是不是就变成了零啊。对吧。哎,点size吧,是不是这应该是零对不对,因为你每循环一次呢,我迭代期就删一次啊。这是我用过迭代器去删,那为什么这个删就好使呢?你看是零吧,就删完了,这就没事儿。
15:00
那为什么上面这个就有事儿呢?哎,其实是怎么回事啊各位啊。我大概给大家说一下啊,你可以这样去理解。就是现在呀,有一个什么呀,有一个集合,集合里边放元素了。明白吧,一个两个三个四个元素。那么这这个时候呢,这个时候我们在这儿呢,假如说这个是一个集合C啊C集合,然后呢,C集合呢,去调一个方法叫一特瑞。C集合去调这个一特瑞这个方法之后返回一个迭代器一特瑞。哎,他这个方法呀。只要在这里一执行,它就会返回一个迭代器。啊,这个迭代器啊,它实际上是一个快照。快照。就像一个照相机一样,啪嚓拍下来了。迭代可以这样去理解啊。源代码你就更看不懂了啊,不用扒那源代码没有意义啊。
16:03
就是获取的迭代器对象。迭代器用来迭代,用来便利集合啊。此时相当于对当前集合的状态。拍了一个快照。明白吧,哎,迭代器迭代的时候。会参照什么呀,这个快照。进行迭代。迭代器迭代的时候会参照这个快照进行迭代。就是啪啦给他拍个照片。你可以这样去理解。就这个照了个照。开始迭代。它迭代器迭代什么迭代是参照了你这个快照进行进行迭代,但这个过程当中有可能你这个元素怎么着没了。
17:09
对吧,哎,没了没了之后呢,集合发生了改变,那你这个快照得重新获取。就你就这这个快照。需要重新去获取。那你如果没有重新获取的话,它就会出问题。啊,它底层会有一个检查机制,会不断检查这个快照和我们的这个原集合的一个。一个一个一个情况。啊,如果发生了改变,那这块就就就给你报异常,他也不做别的处理,他就给你报异常。这个可能就是那个快照吧,假如这样这样去理解。就是说白了,他一直迭代就是一直迭代,就是你最原始获取的那个迭代器。啊,迭代器。然后呢,它迭代的时候再再说一下各位是这样这个集合在这儿是不是有四个元素,然后呢,调用特这个方法啊,它会获取一个什么呀,我们这样类似的这样一个快照,然后接下来这个迭代器怎么着去迭代这个里边元素,一个一个去迭代,一个一个去迭代。
18:11
啊,如果你在迭代过程当中,你把原先老集合里边其中某一个元素给它干掉了。对吧,哎,那么这个时候呢,他在迭代的时候啊,他还是在这个叫什么呀,叫做这个呃,快照上去迭代,但是在迭代过程当中,他会不断的比对这个快照和原先这个集合的这个这个这个这个状态对吧,如果发生了变化,那这个时候他就会报错。就会报错啊,就这边没了,磨了一个这边三个了,那你再往上迭代的话,就会出出问题了,出问题了是这样一个情况,各位啊,那有同学老师。我为什么用迭代器去删就没事儿呢,注意用迭代器去删的话,它会把把这个快照里边这个也删掉。明白吗?懂什么意思吧,就是如果你用迭代器点remove的话。
19:01
他这个方法只要一执行,他把快照里边删掉,同时快照所对应的这个老集合里边这个元素也对应全部给它干掉。这样的话,达到这个快照和我们原集合中的元素是对应的。就没有问题。啊就没有问题,所以说这边这个删除呢,大家注意啊,是通过迭代器去删就没关系,但如果你硬通过集合,在迭代过程当中,你又通过集合去删,那就有问题。因为你通过集合去删,并没有通知迭代器去更新。明白吗?就这个删除表示什么呀,就是直接通过集合去删除元素,没有通知迭代器。导致什么呢?导致迭代器的快照和什么呀?和原集合状态不同。原集合状态不同,它就会出这个问题。
20:02
啊,什么con modification。啊,有这么一个一个一个异常,各位啊,就。这块的一个原理,其实是怎么说呢,就这样去理解各位啊,这样理,其实底层代码特别复杂啊,底层代码特别复杂,就说你现在有一个集合,集合里边假如有四个元素啊,就这块儿也有一个元素吧,嗯。啊,有这样一个元素啊。有这样一个元素。四个,然后接下来我调用这个集合的ER这个方法返回一个it。那就就相当于我们拿到迭代器,迭代器呢,其实会生成一个集合的一个快照。啊,然后接下来在变力的过程当中,你这个迭代器不是在这儿变历吗。对吧,啊,你我们有个规矩,什么叫集合发生变化的,一定要通知这个迭代器,迭代器要重新获取。因为迭代器指向永远是之前的那个老的快照。啊,在迭代。
21:00
如果迭代过程当中,迭代到这个位置上。对吧,你把这个叠在了某个位置上,你把这个元素给它干掉了,不要了。不要之后会导致什么呢?你这个原集合当中的状态和我们迭代和我们快照里边这个状态就不一样了,那这个时候这个迭代器按说你应该重新获取,但是迭代器你没有重新获取,没有重新获取的时候,这个迭代器继续往下就会出这个刚才所说的那个异常。但如果你采用迭代器去删。这个他是把先把快照里边先抹了。同时他会怎么着啊?会把我们集合中的元素给它抹掉。这样保证我们快照和我们的集合一直是统一的,它继续再往下迭代的时候就不会出问题。这就是采用迭代继续删就没事儿,但是采用集合去删就有问题。其实说来说去还是那句话,集合的状态发生改变之后,一定要重新获取迭代期,就是刚才所说的这句话。当集合的结构发生改变时,迭代器必须重新获取。
22:00
如果还是用以前老的迭代器,会出现这个异常。下边这个道理也是一样的,在循环过程当中,你把这个元素给它干掉了,Remove CR remove。是不是,哎软木调,那软木调呢,你的迭代器,你的集合的状态发生改变,迭代器要重新获取啊,但是你物循环往下继续循环的时候,它就出问题了。但是你用迭代器去删就没事儿,你看是吧,迭代器去删。对吧,啊迭代继续上。迭代器去删除时。会将会自动更新什么迭代器。并且更新什么集合。其实就是删除集合中元素,删除集合中的元素,就这个会更新迭代器,这个不会更新迭代器,明白吧,这个出异常是因为什么呀?啊,出异常根本原因。
23:01
是集合。中元素删除了,但是没有更新。迭代器就迭代器,不知道不知道几何变化了。这块就知道了,你用迭代器删迭代器自己这个对象去删,他当然知道了,在底层这个轮布方法实现的时候,对吧,他自己自然是知道,哎,哦。我通过迭代删行,我把我自己快照里边删掉,然后同时集合里面元素也给它删掉啊就这样去理解吧,各位啊这样去理解。也不太那么好理解这个东西啊,不太好理解,就是说集合删除集,呃,就记住一句话,集合状态改变时重新获取迭代器,集合状态改变时重新获取迭代器啊,集合状态发生变化了,对吧,要重新去获取迭代器,要不然你会出问题,出那个异常,就是这个异常。啊,这个异常,当然你在循环遍历过程当中,删除元素的时候,建议使用迭代器去删,不要使用集合的删除方法啊来这块呢。
24:07
一个重点啊。在迭代元素的过程当中。一定要使用迭代器。一特。Rita。一定要使用迭代器。E的。Remove方法删除元素啊,不要使用集合自带的remove方法。删除元素各位啊。
我来说两句