参考: https://www.cnblogs.com/litexy/p/9744241.html
Java中的Iterable与Iterator详解
在Java中,我们可以对List集合进行如下几种方式的遍历:
List<Integer> list = new ArrayList<>();
list.add(5);
list.add(23);
list.add(42);
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + ",");
}
Iterator it = list.iterator();
while (it.hasNext()) {
System.out.print(it.next() + ",");
}
for (Integer i : list) {
System.out.print(i + ",");
}
第一种就是普通的for循环,第二种为迭代器遍历,第三种是for each循环。后面两种方式涉及到Java中的iterator和iterable对象,接下来我们来看看这两个对象的区别以及如何在自定义类中实现for each循环。
Iterator与Iterable
iterator为Java中的迭代器对象,是能够对List这样的集合进行迭代遍历的底层依赖。而iterable接口里定义了返回iterator的方法,相当于对iterator的封装,同时实现了iterable接口的类可以支持for each循环。
iterator内部细节
jdk中Iterator接口主要方法如下:
public interface Iterator<E> {
boolean hasNext();
E next();
}
iterator通过以上两个方法定义了对集合迭代访问的方法,而具体的实现方式依赖于不同的实现类,具体的集合类实现Iterator接口中的方法以实现迭代。
可以发现,在List中并没有实现Iterator接口,而是实现的Iterable接口。进一步观察Iterable接口的源码可以发现其只是返回了一个Iterator对象。
public interface Iterable<T> {
Iterator<T> iterator();
}
所以我们可以使用如下方式来对List进行迭代了(通过调用iterator()方法)
Iterator it = list.iterator();
while (it.hasNext()) {
System.out.print(it.next() + ",");
}
同时实现了Iterable接口的还可以使用for each循环。