所有的collection(list、Set)、Map都实现了Iterable接口,进而能够使用了Iterator()迭代器方法。首先搬源码
Iterable接口
public interface Iterable<T> {
//定义了一个Iterator<T>迭代器类型的iterator()方法
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接口
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
一、为什么要采用Iterator迭代器?
http://www.cnblogs.com/ClassNotFoundException/p/7092041.html
如果没有迭代器,那么访问集合类的内部会显得非常的麻烦,表现在代码与集合类的紧密耦合上,且代码不具有好的复用性。
(想想在没有学习Iteartor的时候,是不是想要遍历集合中的元素,都要苦逼的手打for循环)
而Iterator迭代器采用了同一种逻辑来遍历集合for(Iterator it = c.iterater(); it.hasNext(); ) { ... } 。所有的集合都可以使用这个方法。
二、为什么要实现Iterable接口?
http://wenda.so.com/q/1463366831725686?src=140
看到Iterable中封装了Iterator接口,所以只要实现了Iterable接口的类,就可以使用Iterator迭代器了。
三、Iterable接口和Iterator接口的区别?
http://wenda.so.com/q/1463366831725686?src=140
Iterator是迭代器,是一个接口。而Iterable是为了只要实现该接口就可以使用foreach,进行迭代。
Iterator中核心的方法next(),hasnext(),remove(),都是依赖当前位置,如果这些集合直接实现Iterator,则必须包括当前迭代位置的指针。当集合在方法间进行传递的时候,由于当前位置不可知,所以next()之后的值,也不可知。而当实现Iterable则不然,每次调用都返回一个从头开始的迭代器,各个迭代器之间互不影响。