前言
- 一般遍历数组都是采用for循环或者增强for,这两个方法也可以用在集合框架,但是还有一种方法是采用迭代器遍历集合框架,它是一个对象,实现了Iterator 接口或ListIterator接口。
- 迭代器,使你能够通过循环来得到或删除集合的元素。ListIterator 继承了Iterator,以允许双向遍历列表和修改元素。
原理
- 在获取迭代器的时候,会创建一个集合的副本。同时会创建一个指针指向迭代器迭代集合的其实位置。
方法
- hasNext() :该方法会判断集合对象是否还有下一个元素,如果已经是最后一个元素则返回false。
- next():把迭代器的指向移到下一个位置,同时,该方法返回下一个元素的引用。
- remove() 从迭代器指向的集合中移除迭代器返回的最后一个元素。
public class Test{
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("Hello");
list.add("World");
list.add("HAHAHAHA");
Iterator<String> ite = list.iterator();
//判断下一个元素之后是否有值
while(ite.hasNext()){
System.out.println(ite.next());
}
}
}
异常
ConcurrentModificationException异常
异常名:并发修改异常
产生原因:在使用迭代器遍历集合元素的同时对集合元素进行了操作时抛出此异常
解决办法:
使用普通for循环遍历
使用List特有的迭代器遍历
public class Test {
public static void main(String[] args) {
Collection<String> c = new ArrayList<String>();
c.add("张三");
c.add("李四");
c.add("王五");
Iterator<String> it = c.iterator();
while(it.hasNext()){
//必须是接收it.next(),不然会死循环。
Object obj = it.next();
String s = (String)obj;
if(s.contains("李四")){
// 最后会报ConcurrentModificationException异常
c.add("王五");
}
System.out.println(s);
}
}
}
使用foreach也会出现同样的异常:
}
for (Object object : c) {
String s = (String)object;
if (s.contains("李四")) {
c.add("王五");
}
System.out.println(s);
}
因为foreach遍历的本质就是使用iterator迭代器遍历。
注意:
在迭代的时候是可以删除元素的。因为会使用iterator中的remove。
看一下ArrayList中iterator重写的源码就明白了。
iterator和for循环的区别:
从数据结构角度分析,for循环适合访问顺序结构,可以根据下标快速获取指定元素.而Iterator适合访问链式结构,因为迭代器是通过next()来定位的.可以访问没有顺序的集合.
以上
@Fzxey