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

简介: [[集合] Itreator源码解析(3)](https://copyfuture.com/blogs-details/20191017160706614rpgeagffzztaeod) 本篇文章不长,因为只介绍Itreator接口,而不涉及它的实现。

[[集合] 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源码解析

插播广告:

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

程序编程之旅
感谢关注

吾非大神,与汝俱进

目录
相关文章
|
14天前
|
XML Java Android开发
Android实现自定义进度条(源码+解析)
Android实现自定义进度条(源码+解析)
47 1
|
26天前
|
Shell Linux 开发工具
【Shell 命令集合 文件管理】Linux 高级的文件管理器 mc 命令解析
【Shell 命令集合 文件管理】Linux 高级的文件管理器 mc 命令解析
38 0
|
29天前
|
Python
区域代理分红商城系统开发源码片段示例规则解析
level = Column(Integer, default=1) # 代理等级,例如:1代表普通用户,2代表初级代理,3代表高级代理等 parent_id = Column(Integer, ForeignKey('user.id')) # 上级代理ID 【更全面的开发源码搭建可V or TG我昵称】 parent = relationship("User", remote_side=[id]) # 上级代理对象
|
1月前
|
存储 安全 Java
ArrayList源码全面解析
ArrayList源码全面解析
|
2月前
|
Java 关系型数据库 数据库连接
Spring源码解析--深入Spring事务原理
本文将带领大家领略Spring事务的风采,Spring事务是我们在日常开发中经常会遇到的,也是各种大小面试中的高频题,希望通过本文,能让大家对Spring事务有个深入的了解,无论开发还是面试,都不会让Spring事务成为拦路虎。
33 1
|
1月前
|
存储 安全 Java
HashMap源码全面解析
HashMap源码全面解析
|
18天前
|
存储 NoSQL 算法
【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(字典)(二)
【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(字典)
33 0
|
27天前
|
Linux C++ iOS开发
VLC源码解析:视频播放速度控制背后的技术
VLC源码解析:视频播放速度控制背后的技术
72 0
|
27天前
|
存储 编解码 缓存
FFmpeg之旅:深入解析FFplay源码
FFmpeg之旅:深入解析FFplay源码
97 0
|
1月前
|
负载均衡 算法 Java
SpringCloud负载均衡源码解析 | 带你从表层一步步剖析Ribbon组件如何实现负载均衡功能
SpringCloud负载均衡源码解析 | 带你从表层一步步剖析Ribbon组件如何实现负载均衡功能

推荐镜像

更多