Iterator和Iterable的联系与区别

Iterator和Iterable都是接口。Iterator所属的包是java.util, 而Iterable隶属于java.lang包下。

Iterator

Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被称为迭代器。当遍历集合时,首先通过调用t集合的iterator()方法获得迭代器对象,然后使用hashNext()方法判断集合中是否存在下一个元素,如果存在,则调用next()方法将元素取出,否则说明已到达了集合末尾,停止遍历元素。

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

每个集合的实现类都在内部通过内部类实现Iterator接口,重写了iterator()方法,也就是每个集合将取出元素方式的细节进行封装。

以ArrayList为例:

 Iterator和Iterable的联系与区别

 在公司项目中遇到了下一段代码,刚开始有点懵,实际上每个变量entry.getValue( )代表Map集合中的每个entrySet,再通过Set集合的迭代器iterator取出需要的元素。

 Iterator和Iterable的联系与区别

Iterator接口中有一个forEachRemaining方法,与Iterable的forEach方法不同的是:

forEachRemaining()方法内部是通过使用迭代器Iterator的所有元素,forEach()方法内部使用的是增强for循环。

forEachRemaining()方法第二次调用不会做任何操作,因为不会有下一个元素。forEach()方法可以多次调用,

 Iterator和Iterable的联系与区别

Iterable

Iterable意为“可迭代的”, 实现了这个接口的集合对象支持迭代,是可迭代的,是Jdk1.5之后添加的新接口, 也是Collection的父接口。实现了Iterable的类就是可迭代的.并且支持增强for循环。

Iterable接口中有一个iterator()方法,用来生成带泛型的迭代器Iterator.  Iterable接口是Java集合框架的*接口, Collection接口实现了Iterable,而所有单列集合都是Collection接口的实现类,所以,所有单列集合都可以通过iterator()方法获取自己的迭代器。

Iterator和Iterable的联系与区别

Iterable有三个方法,分别是:

  Iterator iterator();

  default void forEach(Consumer action){}; (JDK 1.8后新增 )。该方法是循环输出,对内部元素进行遍历,并对元素进行指定的操作,直到所有元素都被处理或者动作抛出一个异常 为止。除非被实现类指定,动作将以迭代的顺序执行。

  default Spliterator spliterator(){}; (JDK 1.8后新增)。该方法提供了一个可以并行遍历元素的迭代器,以适应现在cpu多核时代并行遍历的需求。简单说:分割,增加并行处理能力

 

编写一个集合类

如果需要我们自己编写一个集合类,实现forEach的功能,只需要满足以下两个条件:

  1. 集合类实现Iterable接口,该接口要求返回一个Iterator对象
  2. 在集合内部创建一个内部类,实现iterator()方法。

 Iterator和Iterable的联系与区别

这个集合类通过一个内部类ReverseIterator来实现Iterator接口。这个内部类可以直接访问对应的外部类的所有字段和方法:通过ReverseList.this获得当前外部类的this引用,然后,通过这个this引用就可以访问ReverseList的所有字段和方法。

集合类编写完成后,调用方无需知道集合内部的存储逻辑和遍历逻辑,直接通过接口Iterable中的forEach方法遍历即可。

上一篇:python相关面经-举例说一些python的内建函数


下一篇:python内置函数大全