一、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即可。
Java集合框架深入解析
本文深入探讨了Java集合框架中的核心概念,Iterator和Iterable接口的使用及设计意义。解释了Iterator如何提供对集合元素的遍历和删除操作,以及Iterable接口如何使集合类能够返回一个Iterator,从而实现对集合的灵活迭代。文章强调了通过Iterable接口解耦集合与迭代过程的重要性,使得不同类型的集合可以共享相同的迭代逻辑。
670

被折叠的 条评论
为什么被折叠?



