一、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
是一个接口,实现了Iterator
的类可以支持对该类的对象的内部元素进行读,删操作。
二、Iterable简介
直接看源码:
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);
}
}
可以简单理解为,实现了Iterable
接口的类可以返回一个Iterator
。
三、为何需要Iterable?
java.util
包下的Collection
,都是实现了Iterable
,为何要这么麻烦呢?直接实现Iterator
,通过hasNext()
和next()
来对数据进行操作不就可以了吗?何必多一步使用Iterable#iterator()
呢?
这样的设计其实非常巧妙!如果ArrayList
直接实现Iterator
,那我们要操作ArrayList
就得通过ArrayList
的具体对象!伪代码如下:
public class ArrayList<E> implements Iterator<E> {
boolean hasNext() {
}
E next() {
//return E;
}
}
public class Test {
public static void main(String[] args) {
ArrayList list = new ArrayList();
while(list.hasNext()) {
list.next();
}
}
}
上面的代码中,while()
循环和ArrayList
高度耦合,如果我们不想用ArrayList
,我们需要改变的地方非常多!但如果我们改用Iterable
:
public static void main(String[] args) {
ArrayList list = new ArrayList();
Iterator iterator = list.iterator();
while(iterator.hasNext()) {
iterator.next();
}
}
通过实现Iterable
,while
循环不再与ArrayList
耦合,以后想要改用LinkedList
,只需让LinkedList
提供iterator
即可。