⑴ 集合框架(7)深入分析for-each循环和迭代器
foreach循环和迭代器在java集合框架中的深入分析如下:
一、foreach循环 作用:主要用于数组和实现了Iterable接口的集合实例,提供一种简洁的遍历元素的方式。 底层实现:对于数组,foreach循环底层通过传统的for循环实现;对于Iterable实例,则通过Iterator接口实现元素的访问。 限制:在遍历过程中,如果尝试对集合进行结构性修改,可能会引发异常。这是因为foreach循环在遍历过程中不允许集合结构发生变化,以避免潜在的并发修改问题。
二、迭代器 定义:Iterator是Java.util接口,提供了遍历集合的标准方法。 主要方法:包括hasNext、next以及remove。 优势: 安全性:使用Iterator的remove方法在遍历过程中删除元素是安全的,不会引发异常。这是因为remove方法会同步迭代器和集合的状态,确保删除操作的正确性。 灵活性:Iterator允许在遍历过程中进行复杂的逻辑处理,如条件判断、元素转换等。 多线程环境:在多线程环境中,使用Iterator的remove方法比直接使用集合的remove方法更安全,因为它能够同步两个线程的操作,确保元素的删除与迭代操作的同步进行。
三、Iterator与Iterable的区别 Iterator:是一个用于遍历集合的接口,提供了hasNext、next和remove方法。它本身不存储集合元素,而是提供了一种遍历集合的机制。 Iterable:是一个容器接口,通常与Collections或Generics一起使用。它允许自定义类型的对象实现遍历功能,即允许对象通过foreach循环进行遍历。Iterable接口的实现类必须提供一个返回Iterator对象的iterator方法。
总结: foreach循环和Iterator都是Java集合框架中用于遍历集合的重要工具。 foreach循环简洁易用,但在遍历过程中修改集合结构可能会引发异常。 Iterator提供了更灵活、安全的遍历方式,特别是在遍历过程中需要删除元素时,应使用Iterator的remove方法以避免异常。 理解并灵活运用这两种机制,可以有效避免并发问题,提升代码的健壮性。
⑵ java中 foreach 和迭代器在遍历 List 集合 一些情况下为什么能使用集合自动的删除方法删除元素
你a<70的时候是倒数第二位,也就是66,没有抛出异常是因为之前list大小为5,你删除66后,list大小为4,你第一次遍历list大小为5的数组的时候,66的cursor在index = 4,当你删除后,遍历list大小为4的数组时, cursor = 4 = newlist.size()。
ArrayList里的这个方法就会判断list已经读取完毕了,所以不会抛出异常。
publicbooleanhasNext(){
returncursor!=size;
}
a < 90的时候在第二位就发生了变化,list的大小也发生了变化
看了下ArrayList的源码,每次循环的时候都会call这个方法检查list的大小是否发生了变化,但是这个方法是发生在hasNext方法之后的
(){
if(modCount!=expectedModCount)
();
}