java集合【7】——— iterator和Iterable异同详解
2021-03-11 13:03
204 查看
一、iterator介绍
iterator接口,也是集合大家庭中的一员。和其他的
Map和
Collection接口不同,
iterator主要是为了方便遍历集合中的所有元素,用于迭代访问集合中的元素,相当于定义了遍历元素的规范,而另外的
Map和
Collection接口主要是定义了存储元素的规范。
boolean hasNext(); // 是否有下一个元素 E next(); // 获取下一个元素 // 移除元素 default void remove() { throw new UnsupportedOperationException("remove"); } // 对剩下的所有元素进行处理,action则为处理的动作,意为要怎么处理 default void forEachRemaining(Consumer<? super E> action) { Objects.requireNonNull(action); while (hasNext()) action.accept(next()); }
为什么需要iterator接口?
首先,我们知道
iterator接口是为了定义遍历集合的规范,也是一种抽象,把在不同集合的遍历方式抽象出来,这样遍历的时候,就不需要知道不同集合的内部结构。
为什么需要抽象?
假设没有
iterator接口,我们知道,遍历的时候只能通过索引,比如
for(int i=0;i<array.size();i++){ T item = array[i]; }
这样一来,耦合程度比较高,如果使用的数据结构变了,就要换一种写法,不利于维护已有的代码。如果没有
iterator,那么客户端需要维护指针,相当于下放了权限,会造成一定程度的混乱。抽象则是把遍历功能抽取出来,交给
iterator处理,客户端处理集合的时候,交给更“专业”的它,it do it well.
二、iterable接口
iterable接口其实是java集合大家庭的最顶级的接口之一了,实现这个接口,可以视为拥有了获取迭代器的能力。
Iterable接口出现在JDK1.5,那个时候只有
iterator()方法,主要是定义了迭代集合内元素的规范。从字面的意思看,是指可以迭代的接口。
源码如下:
// 返回一个内部元素为T类型的迭代器(JDK1.5只有这个接口) Iterator<T> iterator(); // 遍历内部元素,action意思为动作,指可以对每个元素进行操作(JDK1.8添加) default void forEach(Consumer<? super T> action) {} // 创建并返回一个可分割迭代器(JDK1.8添加),分割的迭代器主要是提供可以并行遍历元素的迭代器,可以适应现在cpu多核的能力,加快速度。 default Spliterator<T> spliterator() { return Spliterators.spliteratorUnknownSize(iterator(), 0); }
从上面的源码可以看出,
iterable接口主要是为了获取
iterator,附带了一个
foreach()方法。
集合
Collection、
List、
Set都是Iterable的实现类,它们及其他们的子类都可以使用foreach进行迭代。
三、为什么有Iterator还需要Iterable
我们看到
Iterator其实已经有很多处理集合元素相关的方法了,为什么还需要抽象一层呢?很多集合不直接实现
Iterator接口,而是实现
Iterable?
1.
Iterator接口的核心方法next()或者hashNext(),previous()等,都是严重依赖于指针的,也就是迭代的目前的位置。如果Collection直接实现
Iterator接口,那么集合对象就拥有了指针的能力,内部不同方法传递,就会让next()方法互相受到阻挠。只有一个迭代位置,互相干扰。
2.
Iterable每次获取迭代器,就会返回一个从头开始的,不会和其他的迭代器相互影响。
3.这样子也是解耦合的一种,有些集合不止有一个
Iterator内部类,可能有两个,比如
ArrayList,
LinkedList,可以获取不同的
Iterator执行不一样的操作。
【作者简介】:
秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。个人写作方向:Java源码解析,JDBC,Mybatis,Spring,redis,分布式,剑指Offer,LeetCode等,认真写好每一篇文章,不喜欢标题党,不喜欢花里胡哨,大多写系列文章,不能保证我写的都完全正确,但是我保证所写的均经过实践或者查找资料。遗漏或者错误之处,还望指正。
平日时间宝贵,只能使用晚上以及周末时间学习写作,关注我,我们一起成长吧~
相关文章推荐
- java集合_浅谈Iterable和Iterator的区别
- Map、Set、Iterator迭代详解与Java平台的集合框架
- Java中的Iterable和Iterator详解
- Java 集合中关于Iterator 和ListIterator的详解
- Map、Set、Iterator迭代详解与Java平台的集合框架
- Map、Set、Iterator迭代详解与Java平台的集合框架
- java基础:13.2 集合框架 - Iterator、Iterable
- Map、Set、Iterator迭代详解与Java平台的集合框架
- Java--Iterator接口和Iterable接口详解
- Java--Iterator接口和Iterable接口详解
- Java集合(1)——Iterable接口和Iterator接口
- Java Iterator接口遍历单列集合迭代器原理详解
- Java 集合:迭代器(Iterator, Iterable)
- Java--Iterator接口和Iterable接口详解
- Java--Iterator接口和Iterable接口详解
- Java--Iterator接口和Iterable接口详解
- Java--Iterator接口和Iterable接口详解
- Java--Iterator接口和Iterable接口详解
- Java--Iterator接口和Iterable接口详解
- Java集合之ArrayList和LinkedList的实现原理以及Iterator详解