for,增强for,迭代器3种方式遍历集合的同时修改元素的区别

数据容器List A;
1.for
for(int i = 0 ; i<A.length; i++){
A.remove(i);
}
在每次循环时,每删除一次元素后,A就发生了变化。所以每次循环针对的容器是不同的可以简单理解为每次遍历的容器依次是A1、A2、A3、A4、、、、、、
由于容器每次都在改变,所以每次A[i]所对应的元素是不一样的。

2.增强for循环类似,每次循环时候相当于边删除边读取,删除元素后继续循环会报错误信息ConcurrentModificationException,因为元素在使用的时候发生了并发的修改,导致异常抛出;

3.迭代器遍历。
迭代器相当于原先数据容器的一个副本,并保持与原先的数据容器内容的内容对比。当原先容器内容发生改变,迭代器发现自己数据与原容器数据不一致,报错。
但是迭代器自己数据发生改变,原先容器内容没有变化,则不会报错。
也就是说,原先容器内容和迭代器内容可以不保持一致,但是是通过百变迭代器内容的。
迭代器相当于原先容器一个副本。
修改副本内容可以,修改原先容器不行。,不然报错。

在使用Iterator的时候,迭代器会新建一个线程,把原来的线程中的对象重新拷贝一份,在进行删除,修改等操作时,原来的线程只负责迭代,而Iterator负责迭代和删除操作,Iterator每次迭代都会检查迭代器里的对象和原线程中的对象个数是否一致,不一致则抛出:ConcurrentModificationException。

要想实现边遍历边删除操作,需要使用迭代器的删除方法,这个方法可以将迭代器中数据副本的改变反向同步到原先的容器中。使用原先容器的删除方法只是改变了原先容器的内容,并没有将内容同步到副本中,不可取。

猜你喜欢

转载自blog.csdn.net/qq_24699905/article/details/85624396
今日推荐