聊一聊Iterable与Iterator的那些事!
前言
欢迎关注公众号: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 iterator();
- default void forEach(Consumer<? super T> action){}; JDK 1.8后新增
- default Spliterator 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~

聊一聊Iterable与Iterator的那些事!的更多相关文章
- Java中的Iterable与Iterator详解
在Java中,我们可以对List集合进行如下几种方式的遍历: List<Integer> list = new ArrayList<>(); list.add(5); list ...
- java学习--Iterable 和 Iterator
Iterable Iterable :故名思议,实现了这个接口的集合对象支持迭代,是可迭代的. 一个集合对象要表明自己支持迭代,能有使用foreach语句的特权,就必须实现Iterable接口,表明我 ...
- iterable与iterator
1.迭代器的感性认识 对于Collection类下的集合如各种List各种Set,用于实现这些集合的数据结构各不相同,比如数组实现的ArrayList.链表实现的LinkedList,当客户端知道要使 ...
- java 中的 Comparable 和 Comparator 与 Iterable 和 Iterator
Comparable 和 Comparator Comparable 和 Comparator 是两个关系不大的类,其分别侧重于不同的方面. 其中,接口 Comparable<T> 强行对 ...
- Python学习之路day4-列表生成式、生成器、Iterable和Iterator
一.列表生成式 顾名思义,列表生成式就是用于生成列表的特殊语法形式的表达式. 1.1 语法格式 [exp for iter_var in iterable] 工作过程: 1.通过iter_var迭代i ...
- Python:Iterable和Iterator
转于:https://blog.csdn.net/whgqgq/article/details/63685066 博主:gongqi1992 iterable和iterator最基本的区别: iter ...
- Java中的Enumeration、Iterable和Iterator接口详解
前言 在看各类Java书籍或者博文的时候,总是会遇到Enumeration.Iterable和Iterator这三个接口,如果对这几个接口不是很明白的话,总会让自己看着看着就迷惑了,正好这周末,抽空把 ...
- Java基础之Iterable与Iterator
Java基础之Iterable与Iterator 一.前言: Iterable :故名思议,实现了这个接口的集合对象支持迭代,是可迭代的.able结尾的表示 能...样,可以做.... Iterato ...
- Java集合【4】-- iterable和Iterator的异同分析详解
目录 一.iterator介绍 二.iterable接口 三.为什么有Iterator还需要Iterable 一.iterator介绍 iterator接口,也是集合大家庭中的一员.和其他的Map和C ...
随机推荐
- unity shader序列帧动画代码,顺便吐槽一下unity shader系统
一.看到UNITY论坛里有些人求unity shader序列帧动画,写shader我擅长啊,就顺势写了个CG的shader.代码很简单,就是变换UV采样序列帧贴图,美术配置行数列数以及变换速度. Sh ...
- linux 流量统计
因为很多vps或者服务器都是限流量的,但是又很多服务商并没有提供详细的流量表,比如每天的流量表,所以肯定有人很想知道自己服务器到底跑了多少流量. vnstat就是一个很好用的服务器流量统计命令.我截几 ...
- [Erlang22]如何按规则位数输出数字
需求:把一个数字指定长度输出 例如: 1 00000001 12 00000012 1203 00001203 123456789 123456789 1234567 01234567 方法一: ...
- tar.gz 解压
tar -xzvf .tar.gz tar [-cxtzjvfpPN] 文件与目录 .... 参数: -c :建立一个压缩文件的参数指令(create 的意思): -x :解开一个压缩文件的参数指令! ...
- Docker 入门笔记
Docker 可以理解为一个轻量化的虚拟机, 启动速度快,本身占的资源小 [重要], 容器里是不能保存数据的,容器只要一停止, 所有的数据都会丢失,所以如果重要的数据, 都需要通过配制,把数据保存在 ...
- 基于ASP.NET的MVC框架下的MvcPaper分页控件的使用技术
using System; using System.Collections.Generic; using System.Linq; using System.Web; using Webdiyer. ...
- phonegap3.0+HTMLl5 开发 ipad app 总结
忙碌了一段时间,终于完成了手上的这个ipad上的app ,app是用phonegap+ jquery mobile 开发的,不是用原生的objective c开发的.因为app有许多chart的渲染, ...
- mac下MySQL Workbench安装
参见:http://www.cnblogs.com/macro-cheng/archive/2011/10/25/mysql-001.html 去mysql官网下载社区的.dmg安装包 分别安装: 分 ...
- 「HNOI 2016」 序列
\(Description\) 给你一个序列,每次询问一个区间,求其所有子区间的最小值之和 \(Solution\) 这里要用莫队算法 首先令\(val\)数组为原序列 我们考虑怎么由一个区间\([l ...
- kolla-ansible安装openstack(Ocata)
基本功能部署 基础环境 角色 操作系统 硬件配置 Depoly CentOS 7 Server 磁盘:40GB 内存:8GB 网卡:ens3(内网) ens4(外网) Sched CentOS 7 S ...