迭代器是一种设计模式,它可以使得序列类型的数据结构的遍历与被遍历对象分离,即我们无需关注序列的底层结构是什么样子只要拿到遍历对象就可以进行遍历,并且它可以选择序列中的对象,进行相关操作。Iterator对于集合中的任意实现类都可以返回Iterator对象,适用于任何一个类
一、Java中的Iterator功能比较简单,并且只能单向移动:
(1) 使用方法iterator()要求容器返回一个Iterator。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。第一次调用Iterator的next()方法时,它返回序列的第一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
迭代器应用示例:
list l = new ArrayList();
l.add("aa");
l.add("bb");
l.add("cc");
for (Iterator iter = l.iterator(); iter.hasNext();) {
String str = (String)iter.next();
System.out.println(str);
}
/*迭代器用于while循环
Iterator iter = l.iterator();
while(iter.hasNext()){
String str = (String) iter.next();
System.out.println(str);
}
二、 Iterator与for each 的区别
for each 的使用:
1 import java.util.*; 2 public class TestIterator { 4 public static void main(String[] args) { 5 6 List<String> list=new ArrayList<String> (); 7 8 for(int i=0;i<10;i++){ 9 list.add(new String("list"+i) ); 10 } 11 12 for(String str:list){ 13 System.out.println(str); 14 } 15 16 }可以看出,使用for each循环语句的优势在于更加简洁,更不容易出错,不必关心下标的起始值和终止值。
使用for循环时,在循环内使用list.remove()会导致错误,可以使用如下方法:
for(int i = 0; i < list.size();i++){ if(true){ list.remove(list.get(i)); --i;//remove的同时下标跟着减 } }
所以,如果想在循环语句中删除集合中的某个元素,就要用迭代器iterator的remove()方法,因为它的remove()方法不仅会删除元素,
还会维护一个标志,用来记录目前是不是可删除状态,例如,你不能连续两次调用它的remove()方法,调用之前至少有一次next()方法的调用。
forEach就是为了让用iterator循环访问的形式简单,写起来更方便。当然功能不太全,所以但如有删除操作,还是要用它原来的形式。
三、 Iterator和for each 效率问题
采用ArrayList对随机访问比较快,而for循环中的get()方法,采用的即是随机访问的方法,因此在ArrayList里,for循环较快。
采用LinkedList则是顺序访问比较快,iterator中的next()方法,采用的即是顺序访问的方法,因此在LinkedList里,使用iterator较快
从数据结构角度分析,for循环适合访问顺序结构,可以根据下标快速获取指定元素.而Iterator 适合访问链式结构,因为迭代器是通过next()和Pre()来定位的.可以访问没有顺序的集合.