**

集合类图

**

java Iterable实现类 java中iterable_迭代


其中, Iterable是在java.lang包下的接口

Iterator是在java.util包下的接口

Iterable接口包装了Iterator接口

Iterable接口

java Iterable实现类 java中iterable_迭代器_02


也就是说,Iterable接口为超级接口,这个接口只有一个方法,该方法的返回类型是Iterator,方法名称称为iterator()。实现这个接口的对象可以称为“for-each”语句的目标。

Iterable的源码如下

public interface Iterable<T> {
    Iterator<T> iterator();
}

Iterable接口中的方法

java Iterable实现类 java中iterable_java_03

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接口:

java Iterable实现类 java中iterable_java Iterable实现类_04


Iterator接口,简单的来说,Iterator也是一个统一的来遍历Collection里面所有元素的方法。在接口之中,只有方法的定义没有方法的实现(也就是说其子类来实现其方法)

对于小小的展开

(1)所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Interator接口的对象

(2)Iterator对象称作迭代器,用以方便的实现对容器内元素的遍历操作

(3)Iterator接口定义了如下方法:

①Boolean hasNext(); //判断游标右边是否有元素

②Object next(); //返回游标右边的元素并将游标移动到下一个位置

③Void remove(); //删除游标左面的元素,在执行完next之后该操作只能执行一次

其源码如下所示

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());
    }
}

Iterable接口与Iterator接口之间的关系

*Iterator提供了一种统一遍历集合元素的方式,使用Iterator对象可以不用关心具体的集合对象的具体类型和内部实现,统一使用Iterator对象方法就可以实现;
*Iterable接口是为了foreach循环设计的,Iterable接口表示可以返回Iterator对象,最终还是使用Iterator遍历

那为什么一定要实现Iterable接口,为什么不直接实现Iterator接口呢?
因为Iterator接口的核心方法next()或者hasNext()是依赖于迭代器的当前迭代位置的。如果Collection直接实现iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。当集合在不同方法间被传递时,由于当前迭代为止不可知,那么next()方法的结果就会变得不可知。除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。但即使是这样,Collection也只能同时存在一个当前迭代位置。而Iterable接口则不然,每次调用都会返回一个从头开始计数的迭代器。多个迭代器之间是互不干扰的。