当我们使用for each遍历集合类,Java的集合类都可以使用for each循环,List、Set和Queue会迭代每个元素,Map会迭代每个key。以List为例:
List<String> list = List.of("Apple", "Orange", "Pear");for (String s : list) {System.out.println(s);}
实际上,Java编译器并不知道如何遍历List。上述代码能够编译通过,只是因为编译器把for each循环通过Iterator改写为了普通的for循环:
for (Iterator<String> it = list.iterator(); it.hasNext(); ) {String s = it.next();System.out.println(s);}
使用迭代器的好处在于,调用方总是以统一的方式遍历各种集合类型,而不必关系它们内部的存储结构。
如果我们自己编写了一个集合类,想要使用for each循环,只需满足以下条件:
- 集合类实现
Iterable接口,该接口要求返回一个Iterator对象; - 用
Iterator对象迭代集合内部数据。 ``` //倒序遍历集合 import java.util.*;
public class Main {
public static void main(String[] args) {
ReverseList
class ReverseList
private List<T> list = new ArrayList<>();public void add(T t) {list.add(t);}@Overridepublic Iterator<T> iterator() {return new ReverseIterator(list.size());}class ReverseIterator implements Iterator<T> {int index;ReverseIterator(int index) {this.index = index;}@Overridepublic boolean hasNext() {return index > 0;}@Overridepublic T next() {index--;return ReverseList.this.list.get(index);}}
}
```
