天天看点

Java集合【4】-- iterable和Iterator的异同分析详解

目录

一、iterator介绍

二、iterable接口

三、为什么有Iterator还需要Iterable

<code>iterator</code>接口,也是集合大家庭中的一员。和其他的<code>Map</code>和<code>Collection</code>接口不同,<code>iterator</code> 主要是为了方便遍历集合中的所有元素,用于迭代访问集合中的元素,相当于定义了遍历元素的规范,而另外的<code>Map</code>和<code>Collection</code>接口主要是定义了存储元素的规范。

为什么需要iterator接口?

首先,我们知道<code>iterator</code>接口是为了定义遍历集合的规范,也是一种抽象,把在不同集合的遍历方式抽象出来,这样遍历的时候,就不需要知道不同集合的内部结构。

为什么需要抽象?

假设没有<code>iterator</code>接口,我们知道,遍历的时候只能通过索引,比如

这样一来,耦合程度比较高,如果使用的数据结构变了,就要换一种写法,不利于维护已有的代码。如果没有<code>iterator</code>,那么客户端需要维护指针,相当于下放了权限,会造成一定程度的混乱。抽象则是把遍历功能抽取出来,交给<code>iterator</code>处理,客户端处理集合的时候,交给更“专业”的它,it do it well.

<code>iterable</code>接口其实是java集合大家庭的最顶级的接口之一了,实现这个接口,可以视为拥有了获取迭代器的能力。<code>Iterable</code>接口出现在JDK1.5,那个时候只有<code>iterator()</code>方法,主要是定义了迭代集合内元素的规范。从字面的意思看,是指可以迭代的接口。

源码如下:

从上面的源码可以看出,<code>iterable</code>接口主要是为了获取<code>iterator</code>,附带了一个<code>foreach()</code>方法。

集合<code>Collection</code>、<code>List</code>、<code>Set</code>都是Iterable的实现类,它们及其他们的子类都可以使用foreach进行迭代。

我们看到<code>Iterator</code>其实已经有很多处理集合元素相关的方法了,为什么还需要抽象一层呢?很多集合不直接实现<code>Iterator</code>接口,而是实现<code>Iterable</code>?

1.<code>Iterator</code>接口的核心方法next()或者hashNext(),previous()等,都是严重依赖于指针的,也就是迭代的目前的位置。如果Collection直接实现<code>Iterator</code>接口,那么集合对象就拥有了指针的能力,内部不同方法传递,就会让next()方法互相受到阻挠。只有一个迭代位置,互相干扰。

2.<code>Iterable</code> 每次获取迭代器,就会返回一个从头开始的,不会和其他的迭代器相互影响。

3.这样子也是解耦合的一种,有些集合不止有一个<code>Iterator</code>内部类,可能有两个,比如<code>ArrayList</code>,<code>LinkedList</code>,可以获取不同的<code>Iterator</code>执行不一样的操作。

Java集合【4】-- iterable和Iterator的异同分析详解

此文章仅代表自己(本菜鸟)学习积累记录,或者学习笔记,如有侵权,请联系作者删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有错误之处,还望指出,感激不尽~

技术之路不在一时,山高水长,纵使缓慢,驰而不息。

公众号:秦怀杂货店

Java集合【4】-- iterable和Iterator的异同分析详解
上一篇: C#函数重载
下一篇: C#继承