[集合] Itreator源码解析(3)

[[集合] Itreator源码解析(3)] https://copyfuture.com/blogs-details/20191017160706614rpgeagffzztaeod

本篇文章不长,因为只介绍Itreator接口,而不涉及它的实现。

接口缘由

由于每一个容器都有取出元素的功能。这些功能定义都一样,只不过实现的具体方式不同(因为每一个容器的数据结构不一样)所以对共性的取出功能进行了抽取,从而出现了Iterator接口。而每一个容器都在其内部对该接口进行了内部类的实现。也就是将取出方式的细节进行封装。

Itreator接口是Jdk1.5之后添加的新接口, Collection的父接口。 实现了Iterable的类就是可迭代的。并且支持增强for循环。

该接口只有一个方法即获取迭代器的方法iterator()可以获取每个容器自身的迭代器Iterator。

(Collection)集合容器都需要获取迭代器(Iterator)于是在5.0后又进行了抽取将获取容器迭代器的iterator()方法放入到了Iterable接口中。

Collection接口继承了Iterable,所以Collection体系都具备获取自身迭代器的方法,只不过每个子类集合都进行了重写(因为数据结构不同)。

Iterable接口的源码主要方法就是iterator()、forEach(Consumer<? super T> action)、spliterator()(并行遍历),Iterable接口就不做过多介绍了。后面有机会再看。

接口介绍

Itreator直译过来就是迭代器,迭代可以简单的理解为遍历,是一个标准化遍历各类容器里面的所有对象的方法类,它是一个很典型的设计模式。

Iterator 模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。

Iterator是为了方便的处理集合中的元素,该接口提供了一些方法专门处理集合中的元素.例如删除和获取集合中的元素.

该对象比较特殊,不能直接创建对象(通过new),该对象是以内部类的形式存在于每个集合类的内部。

在前面的Collection接口中,已经知道,通过iterator()方法便可以获取集合类迭代器。所以所有的Collection体系集合都可以获取自身的迭代器。

Iterator源码

/**
 *
 * 关于该接口的实现,在集合的实现类中还会再讲到,例如,ArrayList中的Itr
 *
 * @param <E> 此迭代器返回的元素类型
 *
 * @author  Josh Bloch
 * @see Collection
 * @see ListIterator
 * @see Iterable
 * @since 1.2
 */
public interface Iterator<E> {
    /**
     * 判断集合中是否有元素,如果有元素可以迭代,就返回true。
     */
    boolean hasNext();

    /**
     * 返回迭代的下一个元素,注意: 如果没有下一个元素时,调用
     * next方法时,会抛出NoSuchElementException
     */
    E next();

    /**
     * 从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。
     */
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

    /**
     * 为每个剩余元素执行给定的操作,直到所有的元素都已经被处理或行动抛出一个异常。
     * Java Stream的处理在这里不进行详解,后续会有文章专门介绍
     *
     * @param action 要为每个元素执行的操作
     * @throws NullPointerException 如果指定的操作为null
     * @since 1.8之后加的方法  
     */
    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

简单理解:通过Iterator迭代器接口可以访问集合中的每一个元素

其他的没多少好说的了,大家花费3-5分钟应该就可以结束了本篇的阅读。

注意!迭代器中的游标不是指向元素,而是元素之间的位置,所以才有了之前的元素和之后的元素之分!!!

Iterator源码解析地址

https://github.com/chenhaoxiang/JDK1.8/blob/master/jdk-analyze/src/main/java/java/util/Iterator.java

小手点点,实时收获源码解析,感谢您的star

下集预告:

Iterable接口的源码没啥好说的,接下来就是List源码解析

插播广告:

未关注的贝贝可以来波关注啦。后续更多精彩内容等着您。

[集合] Itreator源码解析(3)
感谢关注

吾非大神,与汝俱进

上一篇:【Java入门提高篇】Day21 Java容器类详解(四)ArrayList源码分析


下一篇:OSPF多区域配置(Cisco)