文档章节

聊一聊Iterable与Iterator的那些事!

o
 osc_a22drz29
发布于 2019/03/25 21:22
字数 1527
阅读 17
收藏 0

精选30+云产品,助力企业轻松上云!>>>

前言

欢迎关注公众号:Coder编程 获取最新原创技术文章和相关免费学习资料,随时随地学习技术知识!

在上一篇文章通过面试题,让我们来了解Collection,我们会发现Collection接口之上还有一个接口Iterable, Iterable接口里面又有Iterator接口,那他们到底有什么区别呢?我们接下来就来了解下Iterable与Iterator相关内容,也就是本章的主要内容了,说不定 在我们面试过程中,也会遇到一些问题呢。那我们就开始吧~

涉及面试题:

  • 1.说一说Iterable?
  • 2.Iterable结构?
  • 3.说一说Iterator?
  • 4.Iterator结构?
  • 5.forEachRemaining()与forEach()方法的区别?
  • 6.Iterator如何使用?
  • 7.Iterable与Iterator之间的区别与联系?

上面的面试题可以看出,其实都是一回事,只是换了一种提问方式,只要我们能掌握核心要点,随便面试官怎么提问,我们都能轻松应对!

来源百度百科:

Iterable: 百度的时候,我却只看到了百度翻译:可迭代的; 可重复的; 迭代的; 因此我们可以知道,实现了这个接口的集合对象支持迭代,是可迭代的。

Iterator: Iterator我们一般叫迭代器,它就是提供迭代机制的对象,具体如何迭代,都是Iterator接口规范的。通过UML图,我们也可以看出Iterable接口是Java集合框架的顶级接口, 实现此接口使集合对象可以通过迭代器遍历自身元素。同时在Java设计模式中也有一种模式——迭代器模式.(在后续的文章我们会介绍相关设计模式,敬请关注~) 可以看出Iterator是迭代器模式最好的一个应用例子!

1.说一说Iterable?

由源码图可以看出,Iterable有三个方法,分别是

  • Iterator<T> iterator();
  • default void forEach(Consumer<? super T> action){}; JDK 1.8后新增
  • default Spliterator<T> spliterator(){}; JDK 1.8后新增

接下来我们简单介绍下这里面的方法。

1.1 Iterable接口中的iterator() 方法

Iterator<T> iterator();

该接口主要是返回T类型的元素上的一个迭代器。下面再详细介绍Iterator。

1.2 Iterable接口中的forEach() 方法

default void forEach(Consumer<? super T> action) {
    	// 验证action是否为null,如果action为null,则抛出NullPointerException
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

该方法是循环输出,对内部元素进行遍历,并对元素进行指定的操作。例如:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
 numbers.forEach(integer -> System.out.println(integer));

对源码注释翻译: 对这个Iterable的每一个元素执行给定的动作指导所有元素都被处理或者动作抛出一个异常 为止。除非被实现类指定,动作将以迭代的顺序执行(如果一个迭代的顺序被指定。)被动作 抛出的异常将被传递给调用者

1.3 Iterable接口中的spliterator() 方法

default Spliterator<T> spliterator() {
    return Spliterators.spliteratorUnknownSize(iterator(), 0);
}

该方法提供了一个可以并行遍历元素的迭代器,以适应现在cpu多核时代并行遍历的需求。简单说:分割,增加并行处理能力 对源码注释翻译: 创建一个被这个Iterable接口描述的元素上Spliterator。默认实现从iterable的Iterator中创建一个早期绑定的spliterator。这个spliterator 继承iterable的iterator的fail-fast性质。 默认实现应该总是被重写。被默认实现返回的spliterator拥有不好分解能力,是不依据指定 大小定制的,而且不报告任何spliterator的性质。实现类差不多总是能提供更好的实现。

2.说一说Iterator?

2.1 Iterator是什么?

Iterator被称之为顺序遍历迭代器,jdk中默认对集合框架中数据结构做了实现。 Iterator在实际应用中有一个比较好的点就是,可以一边遍历一遍删除元素。后面我会通过ArrayList中的Iterator()方法进行说明。

2.2 Iterator结构?

由源码图Iterator接口中定义了四个方法,分别是

  • boolean hasNext():如果被迭代遍历的集合还没有被遍历完,返回True
  • Object next():返回集合里面的下一个元素
  • remove():删除集合里面上一次next()方法返回的元素
  • void forEachRemaining(Consumer action):JDK 1.8后新增默认方法 使用Lambda表达式来遍历集合元素

2.3 Iterator接口中的forEachRemaining() 方法

在JDK1.8之后Iterator中增加的一个默认方法

//使用方法
List<String> arr=new ArrayList<>();
arr.add("hello");
arr.add(("world"));
arr.iterator().forEachRemaining(str-> System.out.println(str));

2.3.1 forEachRemaining()与forEach()方法之间的区别?

forEachRemaining()源码:

default void forEachRemaining(Consumer<? super E> action) {
    Objects.requireNonNull(action);
    while (hasNext())
        action.accept(next());
}

forEach()源码:

default void forEach(Consumer<? super T> action) {
    Objects.requireNonNull(action);
    for (T t : this) {
        action.accept(t);
    }
}

通过源码,我们可以看出他们之间的区别与联系。 相同点:

  • 都可以遍历集合
  • 都是接口的默认方法
  • 都是1.8版本引入的

区别:

  • forEachRemaining()方法内部是通过使用迭代器Iterator的所有元素,forEach()方法内部使用的是增强for循环。
  • forEach()方法可以多次调用,forEachRemaining()方法第二次调用不会做任何操作,因为不会有下一个元素。

3.Iterator如何使用?

简单举个小栗子

List list = new ArrayList();
list.add("公众号");
list.add("Coder编程");
for (Iterator iter = list.iterator(); iter.hasNext();) {
String str = (String)iter.next();
System.out.println(str);
}
/*迭代器用于while循环
Iterator iter = list.iterator();
while(iter.hasNext()){
String str = (String) iter.next();
System.out.println(str);
}
*/

推荐阅读

文末

本章节主要介绍了Iterable与Iterator之间的区别与联系,以及其他方面的小知识点,也是面试过程中会出现的内容点。 欢迎关注公众号:Coder编程 获取最新原创技术文章和相关免费学习资料,随时随地学习技术知识!

欢迎大家关注并Star~

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
聊一聊Iterable与Iterator的那些事!

前言 欢迎关注公众号:Coder编程 获取最新原创技术文章和相关免费学习资料,随时随地学习技术知识! 在上一篇文章通过面试题,让我们来了解Collection,我们会发现Collection接口之上还有一个...

Coder编程
2019/03/25
0
0
Iterator to list的三种方法

Iterator to list的三种方法 简介 集合的变量少不了使用Iterator,从集合Iterator非常简单,直接调用Iterator方法就可以了。 那么如何从Iterator反过来生成List呢?今天教大家三个方法。 使用...

flydean
04/30
6
0
【26】Python Iterator笔记

在讲何为迭代器之前,要区分一件事:Iterable可迭代与Iterator迭代器的区别。 可以直接作用域for循环的数据数据类型有以下几种: 一类是集合数据类型,如:list、dict、str、set、tuple等 一...

白羊IT
2018/02/10
0
0
【26】Python Iterator笔记

在讲何为迭代器之前,要区分一件事:Iterable可迭代与Iterator迭代器的区别。 可以直接作用域for循环的数据数据类型有以下几种: 一类是集合数据类型,如:list、dict、str、set、tuple等 一...

白羊IT
2018/06/27
0
0
python迭代器

迭代器 可以直接作用for循环的数据类型 我们已经知道,可以直接作用for循环的数据类型有以下几种: 一类是集合数据类型 如:list、tuple、dict、set、str等; 一类是generator,包括生成器和...

506554897
2017/09/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Eclipse_JavaEE_Tomcat_MySQL环境配置

安装java环境,配置系统变量(JAVA_HOME,绝对路径) 下载eclipse+Tomcat+mysql window——》preference——》server——》runtime——》tomcat环境 项目右键build path 配mysql jar ,libra...

愿有时光可回首
今天
20
0
MySQL原理 - InnoDB引擎 - 行记录存储 - Redundant行格式

本文基于 MySQL 8 在上一篇:MySQL原理 - InnoDB引擎 - 行记录存储 - Compact格式 中,我们介绍了什么是 InnoDB 行记录存储以及 Compact 行格式,在这一篇中,我们继续介绍其他三种行格式。 ...

zhxhash
今天
29
0
leetcode面试题 17.13(恢复空格)--Java语言实现

求: 哦,不!你不小心把一个长篇文章中的空格、标点都删掉了,并且大写也弄成了小写。像句子"I reset the computer. It still didn’t boot!"已经变成了"iresetthecomputeritstilldidntboo...

拓拔北海
今天
19
0
B站跨年晚会究竟做对了什么?

燃财经(ID:rancaijing)原创 作者 | 赵磊 编辑 | 周昶帆 “补课”是《bilibili晚会 二零一九最美的夜》这个视频中,观众在前两分钟刷得最多的弹幕,寓意着观众是在元旦之后回来补看跨年晚会...

子乾建建_Jeff
01/07
59
0
关于Scrapy爬虫项目运行和调试的小技巧(上篇)

点击上方“Python爬虫与数据挖掘”,进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 迟日江山丽,春风花草香。泥融飞燕子,沙暖睡鸳鸯。 扫除运行Scrapy爬虫程序...

yuhan336
04/02
26
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部