迭代器模式在 Java 容器中的实现

  • 迭代器接口是迭代器模式实现的精髓:

    public interface Iterator<E> {
        boolean hasNext();
            E next();
            ...
    }        
  • 假设某容器名为 XxCollection(该类本身并不需实现 Iterator 接口),调用其迭代器遍历访问其所有成员时,一般是通过其 iterator() 方法(Java 容器类如 ArrayList/LinkedList 下的 iterator 也是如下所示)

    public class XxCollection<E> {
        public Iterator<E> iterator() {
            return new Iter();
        }
    }

    而 Iter 类是 XxCollection 类内的私有类:

    private class Itr implements Iterator<E> { 
        public boolean hasNext() {
            ....
        }
        public E next() {
            ....
        }
    }

1. Iterator 与 Iterable

  • Iterator

    package java.util;
    
    public interface Iterator<E> {
        boolean hasNext();
        E next();
        void remove();
    }
  • Iterable

    package java.lang;
    import java.util.Iterator;
    
    public Interface Iterable<T> {
        Iterator<T> iterator();
    }

2. 如何在 java 容器中使用迭代器

// 两个不同的 List 子类
List<String> list = new ArrayList<String>();
List<String> linkList = new LinkedList<String>();

void iterate(List<String> list) {
    Iterator<String> iter = list.iterator();
    while (iter.hasNext()) {
        ....
    }
}

3. Iterator 遍历时不可以删除集合中的元素

在使用Iterator的时候禁止对所遍历的容器进行改变其大小结构的操作。例如: 在使用Iterator进行迭代时,如果对集合进行了add、remove操作就会出现ConcurrentModificationException异常。

因为在你迭代之前,迭代器已经被通过list.itertor()创建出来了,如果在迭代的过程中,又对list进行了改变其容器大小的操作,那么Java就会给出异常。因为此时Iterator对象已经无法主动同步list做出的改变,Java会认为你做出这样的操作是线程不安全的,就会给出善意的提醒(抛出ConcurrentModificationException异常)

原文地址:https://www.cnblogs.com/mtcnn/p/9421041.html