迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Java中的Iterator功能比较简单,并且只能单向移动:
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
1. Iterator iterator = list.iterator();
2. while(iterator.hasNext()){
3. String string = iterator.next();
4. //do something
5. }
迭代其实我们可以简单地理解为遍历,是一个标准化遍历各类容器里面的所有对象的方法类,它是一个很典型的设计模式。Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。在没有迭代器时我们都是这么进行处理的。如下:
对于数组我们是使用下标来进行处理的:
[java]
view plain
copy
1. int[] arrays = new int[10];
2. for(int i = 0 ; i < arrays.length ; i++){
3. int a = arrays[i];
4. //do something
5. }
对于ArrayList是这么处理的:
[java]
view plain
copy
1. List<String> list = new ArrayList<String>();
2. for(int i = 0 ; i < list.size() ; i++){
3. String string = list.get(i);
4. //do something
5. }
6.
对于这两种方式,我们总是都事先知道集合的内部结构,访问代码和集合本身是紧密耦合的,无法将访问逻辑从集合类和客户端代码中分离出来。同时每一种集合对应一种遍历方法,客户端代码无法复用。在实际应用中如何需要将上面将两个集合进行整合是相当麻烦的。所以为了解决以上问题,Iterator模式腾空出世,它总是用同一种逻辑来遍历集合。使得客户端自身不需要来维护集合的内部结构,所有的内部状态都由Iterator来维护。客户端从不直接和集合类打交道,它总是控制Iterator,向它发送"向前","向后","取当前元素"的命令,就可以间接遍历整个集合。
对于我们而言,我们只一般只需使用next()、hasNext()两个方法即可完成迭代。如下:
[java]
view plain
copy
1. for(Iterator it = c.iterator(); it.hasNext(); ) {
2. Object o = it.next();
3. //do something
4. }