迭代器的解释
迭代器(iterator)是一种对象也是一种设计模式,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器是跟容器紧密结合的,不同的容器,它的迭代器不同,但是,他们有共同的目标,就是可以通过该迭代器,来遍历访问这个容器里面的元素。这样带来的好处是在STL设计算法时,可以脱离容器而设计更加通用的算法。有了迭代器,我们可以将算法和特定的容器分离开来。
迭代器的功能
使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素,使用next()获得序列中的下一个元素,使用hasNext()检查序列中是否还有元素,使用remove()将迭代器新返回的元素删除,并且在遍历list或者map等对象的时候,效率比较高,而且能实现一些for循环不能实现的功能。
迭代器与foreach的关系
for each是jdk5.0新增加的一个循环结构,可以用来处理集合中的每个元素而不用考虑集合定下标。 格式如下
for(variable:collection){ statement; }
定义一个变量用于暂存集合中的每一个元素,并执行相应的语句 ( 块 ) 。 collection 必须是一个数组或者是一个实现了 lterable 接口的类对象。看下面这个例子:
import java.util.*;
public class TestIterator {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
for (int i = 0; i < 10; i++) {
list.add(new String("list" + i));
}
for (String str : list) {
System.out.println(str);
}
}
}
可以看出
,
使用
for each
循环语句的优势在于更加简洁,更不容易出错,不必关心下标的起始值和终止值。
forEach
不是关键字
,
关键字还是
for,
语句是由
iterator
实现的,他们最大的不同之处就在于
remove()
方法上。
一般调用删除和添加方法都是具体集合的方法,例如:
List list = new ArrayList(); list.add(a); list.remove(a);
但是,如果在循环的过程中调用集合的remove()方法,就会导致循环出错,因为循 环过程中list.size()的大小变化了,就导致了错误。 所以,如果想在循环语句中删除集合中的某个元素,就要用迭代器iterator的remove()方法,因为它的remove()方法不仅会删除元素,还 会维护一个标志,用来记录目前是不是可删除状态,例如,你不能连续两次调用它的remove()方法,调用之前至少有一次next()方法的调用。 foreach就是为了让用iterator循环访问的形式简单,写起来更方便。当然功能不太全,所以但如有删除操作,还是要用它原来的形式。
使用for循环与使用迭代器iterator的对比
在效率方面的对比: 采用ArrayList对随机访问比较快,而for循环中的get()方法,采用的即是随机访问的方法,因此在ArrayList里,for循环较快。但是,采用LinkedList则是顺序访问比较快,iterator中的next()方法,采用的即是顺序访问的方法,因此在LinkedList里,使用iterator较快。
从数据结构角度分析,for循环适合访问顺序结构,可以根据下标快速获取指定元素.而Iterator 适合访问链式结构,因为迭代器是通过next()和Pre()来定位的.可以访问没有顺序的集合。
使用 Iterator 的好处在于可以使用相同方式去遍历集合中元素,而不用考虑集合类的内部实现(只要它实现了 java.lang.Iterable 接口),如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 Set 来组织数据,那遍历元素的代码不用做任何修改,如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整,因为List有序,Set无序,结构不同,他们的访问算法也不一样。
最后通过一个具体的例子来看JAVA迭代器的使用,源代码如下:
import java.util.*;
public class TestIterator {
public static void main(String[] args) {
ArrayList l = new ArrayList();
l.add("1");
l.add("2");
l.add("3");
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);
}
}
}