iterator为Java中的迭代器对象,是能够对List这样的集合进行迭代遍历的底层依赖。
iterable接口里定义了返回iterator的方法,相当于对iterator的封装,同时实现了iterable接口的类可以支持forEach循环(Jdk1.8后新增的forEach)。
Iterator的源码:
public interface Iterator<E> {
// 判断集合中是否存在下一个对象
boolean hasNext();
// 返回集合中的下一个对象,并将访问指针移动一位
E next();
// 删除集合中调用next()方法返回的对象
default void remove() {
throw new UnsupportedOperationException("remove");
}
}
List中并没有实现Iterator接口,而是实现的Iterable接口,Iterable接口实际上返回的也是一个Iterator对象。
public interface Iterable<T> {
Iterator<T> iterator();
}
为什么不直接将hasNext(),next()方法放在Iterable接口中,其他类直接实现就可以了?
有些集合类可能不止一种遍历方式,实现了Iterable的类可以再实现多个Iterator内部类,例如LinkedList中的ListItr和DescendingIterator两个内部类,就分别实现了双向遍历和逆序遍历。通过返回不同的Iterator实现不同的遍历方式,这样更加灵活。如果把两个接口合并,就没法返回不同的Iterator实现类了。
从英文单词的后缀语法上来看,(Iterable)able 表示这个 List 是支持迭代的,而 (Iterator)tor 表示这个 List 是如何迭代的。
原则上,只要一个 List 实现了 Iterable 接口,那么它就可以使用 for-each 这种方式来遍历,那具体该怎么遍历,还是要看它自己是怎么实现 Iterator 接口的。
对List进行遍历主要有三种方式:
for循环:
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() + ",");
}
forEach:(其实也是使用了Iterator)
for (String str : list) {
System.out.print(str + ",");
}