迭代器模式

迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。

迭代器模式属于行为型模式。

Java手册

java.lang
接口 Iterable<T>

所有已知子接口:
BeanContext, BeanContextServices, BlockingDeque<E>, BlockingQueue<E>, Collection<E>, Deque<E>, List<E>, NavigableSet<E>, Queue<E>, Set<E>, SortedSet<E>
所有已知实现类:
AbstractCollection, AbstractList, AbstractQueue, AbstractSequentialList, AbstractSet, ArrayBlockingQueue, ArrayDeque, ArrayList, AttributeList, BatchUpdateException, BeanContextServicesSupport, BeanContextSupport, ConcurrentLinkedQueue, ConcurrentSkipListSet, CopyOnWriteArrayList, CopyOnWriteArraySet, DataTruncation, DelayQueue, EnumSet, HashSet, JobStateReasons, LinkedBlockingDeque, LinkedBlockingQueue, LinkedHashSet, LinkedList, PriorityBlockingQueue, PriorityQueue, RoleList, RoleUnresolvedList, RowSetWarning, SerialException, ServiceLoader, SQLClientInfoException, SQLDataException, SQLException, SQLFeatureNotSupportedException, SQLIntegrityConstraintViolationException, SQLInvalidAuthorizationSpecException, SQLNonTransientConnectionException, SQLNonTransientException, SQLRecoverableException, SQLSyntaxErrorException, SQLTimeoutException, SQLTransactionRollbackException, SQLTransientConnectionException, SQLTransientException, SQLWarning, Stack, SyncFactoryException, SynchronousQueue, SyncProviderException, TreeSet, Vector

public interface Iterable<T>

实现这个接口允许对象成为 "foreach" 语句的目标。

从以下版本开始:
1.5

方法摘要
 Iterator<T> iterator()
          返回一个在一组 T 类型的元素上进行迭代的迭代器。

 

方法详细信息

iterator

Iterator<T> iterator()
返回一个在一组 T 类型的元素上进行迭代的迭代器。

 

返回:
一个迭代器。

java.util
接口 Iterator<E>

所有已知子接口:
ListIterator<E>, XMLEventReader
所有已知实现类:
BeanContextSupport.BCSIterator, EventReaderDelegate, Scanner

public interface Iterator<E>

对 collection 进行迭代的迭代器。迭代器取代了 Java Collections Framework 中的 Enumeration。迭代器与枚举有两点不同:

  • 迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的 collection 移除元素。
  • 方法名称得到了改进。

此接口是 Java Collections Framework 的成员。

从以下版本开始:
1.2
另请参见:
Collection, ListIterator, Enumeration

方法摘要
 boolean hasNext()
          如果仍有元素可以迭代,则返回 true
 E next()
          返回迭代的下一个元素。
 void remove()
          从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。

 

Iterator  是一个强大的工具,他可以迭代集合框架里面的所有子接口里实现的集合

迭代其实就是一种遍历的方式。

实例:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class IteratorDemo {
    public static void main(String[] args) {
        
        // 用List接口的一个子类ArrayList进行实现
        List<String> list = new ArrayList<>();
        list.add("老王");
        list.add("老李");
        list.add("老张");
        list.add("老李");
        list.add("老丁");
        list.add("老孙");
        
        // 下面我们开始遍历输出这个数组列表
        // 1.for循环遍历
        for(int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + ", ");
        }
        System.out.println();// 换行
        
        // 2.foreach循环遍历这个数组
        for(String s : list) {
            System.out.print(s + ", ");
        }
        System.out.println();// 换行
        
        // 3.迭代器遍历
        /**
         * 迭代器的使用方法比较固定
         * 首先创建一个迭代器
         * 然后判断迭代器指向的列表有没有迭代的元素:it.hasNext()
         * 如果有,就遍历出来:it.next()
         */
        Iterator<String> it = list.iterator();
        while(it.hasNext()) {
            System.out.print(it.next() + ", ");
        }
        System.out.println();
        
        // 4.ListIterator 增强型迭代器
        ListIterator<String> Lit1 = list.listIterator();
        while(Lit1.hasNext()) {
            System.out.print(Lit1.next() + ", ");
        }
        System.out.println();
        
        /**
         * ListIterator与传统迭代器的区别
         * 1.ListIterator不止可以向后访问,还可以向前访问
         * 2.ListIterator可以修改集合里的元素
         */
        // ListIterator 从后向前遍历列表
        ListIterator<String> Lit2 = list.listIterator();
        while(Lit2.hasPrevious()) {
            System.out.println(Lit2.previous() + ", ");
        }
        System.out.println();
        
        // ListIterator 修改列表里面的元素
        ListIterator<String> Lit3 = list.listIterator(3);
        if(Lit3.hasPrevious()) {
            Lit3.previous();
            Lit3.set("cjj");
        }
        System.out.println(list + " ");
        
        // 通过迭代器自带的remove方法来移除当前在迭代的元素
        Iterator<String> it1 = list.iterator();
        // 判断是否有下一个元素
        if(it1.hasNext()){
            it.remove();
        }
        System.out.println(list);
    }
}

运行结果:

老王, 老李, 老张, 老李, 老丁, 老孙, 
老王, 老李, 老张, 老李, 老丁, 老孙, 
老王, 老李, 老张, 老李, 老丁, 老孙, 
老王, 老李, 老张, 老李, 老丁, 老孙, 

[老王, 老李, cjj, 老李, 老丁, 老孙] 
[老王, 老李, cjj, 老李, 老丁]