[[集合] 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源码解析
插播广告:
未关注的贝贝可以来波关注啦。后续更多精彩内容等着您。
感谢关注
吾非大神,与汝俱进