小易说IT 小易说IT

Java 迭代器模式(Iterator)示例代码

java.util.Iterator 是集合迭代器,提供 hasNext()next()remove() 三个核心方法。 下面分:基础使用自定义类实现 Iterable+Iterator(手写迭代器)两套示例。

1. 集合自带 Iterator 基础用法

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

public class IteratorDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Java");
        list.add("SpringBoot");
        list.add("MySQL");
        list.add("Redis");

        // 获取迭代器
        Iterator<String> iterator = list.iterator();

        // hasNext() 判断是否还有下一个元素
        while (iterator.hasNext()) {
            // next() 返回下一个元素
            String item = iterator.next();
            System.out.println(item);

            // remove() 删除迭代器当前指向的元素,不能在for-each中删除
            if ("MySQL".equals(item)) {
                iterator.remove();
            }
        }

        System.out.println("删除之后:" + list);
    }
}

注意:不要在 while 循环里多次调用 next();并发修改会抛出 ConcurrentModificationException

2. 自定义容器,实现 Iterable,手写 Iterator(重点)

如果自己写一个数据容器,想要支持 for‑each 循环,需要实现 Iterable<T>,重写 iterator() 返回自定义迭代器对象; 自定义迭代器实现 Iterator<T> 接口。

import java.util.Iterator;

/**
 * 自定义简单数组容器,实现Iterable,可以使用for-each遍历
 * @param <T>
 */
class MyArrayContainer<T> implements Iterable<T> {

    private final T[] array;
    private final int size;

    @SuppressWarnings("unchecked")
    public MyArrayContainer(int size) {
        this.size = size;
        array = (T[]) new Object[size];
    }

    public void set(int index, T value) {
        if(index <0 || index >= size){
            throw new IndexOutOfBoundsException();
        }
        array[index] = value;
    }

    public T get(int index) {
        return array[index];
    }

    public int getSize(){
        return size;
    }

    /**
     * 返回自定义迭代器,实现Iterable必须重写此方法
     * @return Iterator
     */
    @Override
    public Iterator<T> iterator() {
        // 返回内部类迭代器实例
        return new MyIterator();
    }

    /**
     * 自定义迭代器内部类,实现 Iterator<T>
     */
    private class MyIterator implements Iterator<T> {
        // 当前遍历游标
        private int cursor = 0;

        /** 是否还有下一个元素 */
        @Override
        public boolean hasNext() {
            return cursor < size;
        }

        /** 获取下一个元素,游标向后移动 */
        @Override
        public T next() {
            if (!hasNext()) {
                throw new java.util.NoSuchElementException();
            }
            return array[cursor++];
        }

        /** 删除当前元素,可选实现,默认抛出异常 */
        @Override
        public void remove() {
            throw new UnsupportedOperationException("暂不支持删除");
        }
    }
}


public class CustomIteratorDemo {
    public static void main(String[] args) {
        MyArrayContainer<String> container = new MyArrayContainer<>(4);
        container.set(0,"A");
        container.set(1,"B");
        container.set(2,"C");
        container.set(3,"D");

        // 方式1:使用Iterator手动遍历
        Iterator<String> it = container.iterator();
        while(it.hasNext()){
            System.out.print(it.next() + " ");
        }
        System.out.println();

        // 方式2:因为实现了Iterable,支持for‑each增强for循环
        for(String s : container){
            System.out.print(s + " ");
        }
    }
}

3. Iterator 核心方法说明

表格

方法

作用

boolean hasNext()

判断是否存在下一个元素,返回 true/false

E next()

返回下一个元素;无元素抛 NoSuchElementException

default void remove()

删除next()刚刚返回的元素;可选实现

Java 8+ Iterator 新增默认方法 forEachRemaining(Consumer<? super E> action),示例:

Iterator<String> iter = list.iterator();
iter.forEachRemaining(System.out::println);

4. Iterator 与 ListIterator 简单区分

  • Iterator:只能单向向后遍历,所有集合都可用

  • ListIterator:List 专属,可以向前 / 向后遍历,支持 add、set 修改元素,有索引。

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

public class ListIteratorDemo {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);

        ListIterator<Integer> listIt = list.listIterator(list.size());
        // 反向遍历
        while (listIt.hasPrevious()){
            System.out.println(listIt.previous());
        }
    }
}

关键知识点总结

  1. Iterator 是迭代器,Iterable 是可迭代对象;只有实现 Iterable 的类才能使用 for‑each

  2. 迭代器是游标模式,不存储数据,只是遍历容器。

  3. 遍历过程中不要直接用集合修改元素,要用迭代器自带的 remove(),否则触发并发修改异常。


本文原创作者:易君召,详见:https://www.yijunzhao.cc/about,转载请注明出处。

原文链接 https://www.yijunzhao.cc/archives/java-iterator-pattern-example-code

欢迎访问 https://www.yijunzhao.cc/

https://www.yijunzhao.cc/