Java 迭代器的使用 Iterator
阅读原文时间:2023年07月10日阅读:1

Java的集合类可以使用for … each循环

  • List
  • Set
  • Queue
  • Deque

我们以List为例 其实一个java编译器并不知道如何遍历一个List

编译器只是把一个for … each 通过Iterator改写成普通的for循环

        List<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");

        for (String str : list) {
                System.out.println(str);
        }


        List<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");

        for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); )         {
            String str = iterator.next();
            System.out.println(str);
        }

如何让自己编写的集合类使用for..each循环

  • 实现Iterable接口
  • 返回Iterator对象
  • 用Iterator对象迭代

我们自己编写一个集合类ReadOnlyList

public class IteratorTest {

    public static void main(String[] args) {
        ReadOnlyList<String> readOnlyList = new ReadOnlyList<>("a","b","c");
        for (String str : readOnlyList){
            System.out.println(str);
        }
    }
}



public class ReadOnlyList<E> implements Iterable<E> {

    E[] array;

    @SafeVarargs
    public ReadOnlyList(E... array) {
        this.array = array;

    }

    @Override
    public Iterator<E> iterator() {
        return new ReadOnlyIterator();
    }

    class ReadOnlyIterator implements Iterator<E> {

        int index = 0;

        @Override
        public boolean hasNext() {
            return index < ReadOnlyList.this.array.length;
        }

        @Override
        public E next() {
            E e = array[index];
            index++;
            return e;
        }
    }
}

运行结果

a
b
c