当我们使用for each遍历集合类,Java的集合类都可以使用for each循环,ListSetQueue会迭代每个元素,Map会迭代每个key。以List为例:

    1. List<String> list = List.of("Apple", "Orange", "Pear");
    2. for (String s : list) {
    3. System.out.println(s);
    4. }

    实际上,Java编译器并不知道如何遍历List。上述代码能够编译通过,只是因为编译器把for each循环通过Iterator改写为了普通的for循环:

    1. for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
    2. String s = it.next();
    3. System.out.println(s);
    4. }

    使用迭代器的好处在于,调用方总是以统一的方式遍历各种集合类型,而不必关系它们内部的存储结构
    如果我们自己编写了一个集合类,想要使用for each循环,只需满足以下条件:

    • 集合类实现Iterable接口,该接口要求返回一个Iterator对象;
    • Iterator对象迭代集合内部数据。 ``` //倒序遍历集合 import java.util.*;

    public class Main { public static void main(String[] args) { ReverseList rlist = new ReverseList<>(); rlist.add(“Apple”); rlist.add(“Orange”); rlist.add(“Pear”); for (String s : rlist) { System.out.println(s); } } }

    class ReverseList implements Iterable {

    1. private List<T> list = new ArrayList<>();
    2. public void add(T t) {
    3. list.add(t);
    4. }
    5. @Override
    6. public Iterator<T> iterator() {
    7. return new ReverseIterator(list.size());
    8. }
    9. class ReverseIterator implements Iterator<T> {
    10. int index;
    11. ReverseIterator(int index) {
    12. this.index = index;
    13. }
    14. @Override
    15. public boolean hasNext() {
    16. return index > 0;
    17. }
    18. @Override
    19. public T next() {
    20. index--;
    21. return ReverseList.this.list.get(index);
    22. }
    23. }

    }

    ```