接口介绍
Iterable 接口是 Java 集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素。Iterator 接口提供指定类型的迭代器。
Iterable 源码
package java.lang;
/**
* 实现这个接口的类对象,可以使用 "for-each loop" 声明。
*/
public interface Iterable<T> {
/**
* 返回一个迭代器对象。
*/
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
Iterator 源码
package java.util;
import java.util.function.Consumer;
/**
* 一个集合的迭代器对象。
*/
public interface Iterator<E> {
/**
* 判断是否还有下一个元素。
*/
boolean hasNext();
/**
* 返回下一个元素。
*/
E next();
/**
* 删除上一个返回的元素。
*/
default void remove() {
throw new UnsupportedOperationException("remove");
}
/**
* Performs the given action for each remaining element until all elements
* have been processed or the action throws an exception.
*/
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
使用示例
public class MyCollection<E> implements Iterable<E> {
@SuppressWarnings("unchecked")
@Override
public Iterator iterator() {
return new MyIterator();
}
private class MyIterator implements Iterator<E>{
@Override
public boolean hasNext() {
return false;
}
@Override
public E next() {
return null;
}
}
}
for 循环和迭代器 Iterator 对比
ArrayList 随机访问比较快,而 for 循环中 ArrayList 的 get() 方法是随机访问的方法,因此在 ArrayList 里,for循环较快。LinkedList 顺序访问比较快,Iterator 中的 next() 方法是顺序访问的方法,因此在 LinkedList 里,使用 Iterator 较快。从数据结构角度分析,for 循环适合访问顺序结构,可以根据下标快速获取指定元素。而 Iterator 适合访问链式结构,因为迭代器是通过 next() 方法来定位的。