Java中Iterator和Iterable的区别

2023-11-15

iterator为Java中的迭代器对象,是能够对List这样的集合进行迭代遍历的底层依赖。
iterable接口里定义了返回iterator的方法,相当于对iterator的封装,同时实现了iterable接口的类可以支持forEach循环(Jdk1.8后新增的forEach)。

Iterator的源码:

public interface Iterator<E> {
    // 判断集合中是否存在下一个对象
    boolean hasNext();
    // 返回集合中的下一个对象,并将访问指针移动一位
    E next();
    // 删除集合中调用next()方法返回的对象
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }
}

List中并没有实现Iterator接口,而是实现的Iterable接口,Iterable接口实际上返回的也是一个Iterator对象。


public interface Iterable<T> {
  Iterator<T> iterator();
}

为什么不直接将hasNext(),next()方法放在Iterable接口中,其他类直接实现就可以了?
有些集合类可能不止一种遍历方式,实现了Iterable的类可以再实现多个Iterator内部类,例如LinkedList中的ListItr和DescendingIterator两个内部类,就分别实现了双向遍历和逆序遍历。通过返回不同的Iterator实现不同的遍历方式,这样更加灵活。如果把两个接口合并,就没法返回不同的Iterator实现类了。
从英文单词的后缀语法上来看,(Iterable)able 表示这个 List 是支持迭代的,而 (Iterator)tor 表示这个 List 是如何迭代的。
原则上,只要一个 List 实现了 Iterable 接口,那么它就可以使用 for-each 这种方式来遍历,那具体该怎么遍历,还是要看它自己是怎么实现 Iterator 接口的。

对List进行遍历主要有三种方式:
for循环:

for (int i = 0; i < list.size(); i++) {
    System.out.print(list.get(i) + ",");
}

迭代器:

Iterator it = list.iterator();
while (it.hasNext()) {
    System.out.print(it.next() + ",");
}

forEach:(其实也是使用了Iterator)

for (String str : list) {
    System.out.print(str + ",");
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中Iterator和Iterable的区别 的相关文章

  • 如何将未知列数的 ResultSet 映射到 List 并将其显示在 HTML 表中?

    我使用 Netbeans GlassFish 和 JavaDB 创建了一个数据库应用程序 现在我的控制器 Servlet 代码执行一些动态 SQL 查询并返回结果集 或者我可以更改 toString 现在 如何以表格格式显示返回的结果集 我
  • 如何使用 Maven Failsafe 插件运行 JUnit 5 集成测试?

    当我运行命令时 Maven Failsafe 插件找不到我的 JUnit 5 集成测试mvn clean failsafe integration test 尽管它可以找到文件 我有junit jupiter api and junit j
  • 单元测试组合服务方法

    我正在为一个类编写 junit 单元测试 该类使用以下方法实现公开的接口 public Set
  • 项目缺少所需的注释处理库

    我的 Eclipse IDE 突然在问题视图中显示 xxxx 项目缺少所需的注释处理库 xxxx M2 REPO 中的一些旧 jar 我用谷歌搜索 没有找到任何答案 为什么我的项目使用旧的 jar 以及错误来自哪里 To remove th
  • javax.persistence.RollbackException:提交事务时出错],根本原因是 java.lang.StackOverflowError:null

    我有一个使用 Spring Data REST 框架的 Spring Boot API 从 spring boot starter parent 2 1 0 RELEASE 继承的依赖项 我正在尝试执行 PUT 或 PATCH 请求来更新实
  • 如何为小程序提供对文件系统写入的访问权限

    我在设置小程序的策略文件时遇到问题 我是第一次这样做 不知道如何在java中设置小程序的策略文件 实际上我想授予小程序在文件系统上写入的权限 为此我必须向小程序授予文件权限 所以我创建了一个名为 java policy 的文件 并将以下代码
  • JTextField 和 JTextArea

    JTextField 和 JTextArea 有什么不同 是否可以在一个班级中使用这两个班级 总之 JTextField 是单行文本字段 而 JTextArea 可以跨越多行 文档中清楚地解释了这些差异 文本区 http docs orac
  • 具有 CRUD 功能的基于 Spring Web 的管理工具

    在 PHP Symfony 世界里有一个工具叫 Sonata Adminhttps sonata project org https sonata project org 基于 AdminLTE 模板 这是一款一体化管理工具 具有登录 菜单
  • OpenNLP 与斯坦福 CoreNLP

    我一直在对这两个包进行一些比较 但不确定该往哪个方向走 我简单地寻找的是 命名实体识别 人 地点 组织等 性别识别 一个不错的训练 API 据我所知 OpenNLP 和斯坦福 CoreNLP 提供了非常相似的功能 然而 Stanford C
  • 需要正则表达式帮助

    我正在尝试替换两次或多次出现的 br like br br br 标签与两个一起 br br 具有以下模式 Pattern brTagPattern Pattern compile lt s br s s gt s 2 Pattern CA
  • maven 无法下载 jacoco 0.7.10-SNAPSHOT jar

    我对此感到困惑 我的 pom xml 中有这个
  • 将现有 eclipse 项目导出到 war 文件时出现“模块名称无效”

    我正在尝试将现有 Eclipse 项目导出到 war 文件 但无论我在 WAR Export 对话框页面中输入什么 系统总是返回 模块名称无效 我不知道如何解决这个问题 谢谢您的帮助 我有同样的问题 我修复了它 请按照以下步骤操作 您可以创
  • 改变 Java 中凯撒移位的方向

    用户可以通过选择 1 向左或 2 向右移动字母来选择向左或向右移动 左边工作正常 右边不行 现在它显示了完全相同的循环 但我已经改变了所有 and 以不同的方式进行标记 最终我总是得到奇怪的字符 如何让程序将字符向相反方向移动 如果用户输入
  • 配置jmxremote时无法正常停止tomcat

    我添加了一个jmxremotecatalina bat中的配置 set JAVA OPTS Dcom sun management jmxremote port 9004 Dcom sun management jmxremote ssl
  • Java8:流映射同一流中的两个属性

    我有课Model带有以下签名 class Model private String stringA private String stringB public Model String stringA String stringB this
  • Java 中处理异步响应的设计模式

    我读过类似问答的答案 如何在 JAVA 中创建异步 HTTP 请求 https stackoverflow com questions 3142915 how do you create an asynchronous http reque
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • java中的预增量/后增量

    有人可以帮助我理解为什么 int i 1 int j 1 int k 1 int l 1 System out println i i System out println j j System out println k k System
  • Java 中的微分方程

    我正在尝试用java创建一个简单的SIR流行病模型模拟程序 基本上 SIR 由三个微分方程组定义 S t l t S t I t l t S t g t I t R t g t I t S 易感人群 I 感染人群 R 康复人群 l t c
  • 如何使用注释处理 Hibernate 和 Spring 中的连接查询?

    我正在使用 Spring 和 Hibernate 以及 MySQL 开发应用程序 我是 Hibernate 新手 完成了基本任务 现在我需要在选择查询中应用联接以使用注释从多个表中获取数据 我已经搜索过但仍然没有任何想法 这是我的数据库表和

随机推荐

  • VS2019写的代码无法在VS2022编译处理方法

    将VS2019 下面 netframework 依赖复制到 VS2022 下面 路径 C Program Files x86 Reference Assemblies Microsoft Framework NETFramework 重启V
  • 量化投资学习-33:MACD量化交易

  • 微信小程序(一):微信小程序与服务器的简单链接

    生活无趣且不易 一起找点乐子吧 欢迎评论 和文章无关的东西也没关系 关于小程序的有些问题 我搜索不到太有价值的东西 可能是我对关键字的理解不好 在这里我总结下遇到各种问题 可能看来会比较可笑 但对新手来说也许会有些帮助 我会尽量去注重具体的
  • 微众银行DSS部署单机-普通版

    DSS 普通版部署 我的服务器 我的配置 vim conf config sh vim conf db sh QA 我的服务器 centos 7 0 8C16G 100G机械硬盘 我的配置 bashrc文件内容 JDK export JAV
  • 基本稳压电路

    经过整流后的电源具有较大的电压纹波 单靠调节滤波电容不能明显改善输出电源纹波特性 因此需要采用稳压电路来减小输出电源的纹波 若直将稳压管接至负载输出 则稳压管的工作特性受负载影响较大 甚至会出现不能正常工作的情况 采用下图所示的稳压电路则能
  • 9种小程序赚钱方法!看懂的人已经在行动了

    小程序自上线以来 市面上出现了越来越多与小程序相关的行业 针对目前市面上已出现的小程序商业形式 微趋道今天整理出了以下9种小程序盈利模式分享给大家 微趋道 就是小程序 纯小程序创业 自小程序上线以来 不断有创业者加入到小程序创业中 小程序相
  • 【软件测试 #1】策略练习题

    软件测试策略习题 1 单选 根据软件需求规格说明书 在开发环境下对已经集成的软件进行的测试是 A 集成测试 B 单元测试 C 系统测试 D 验收测试 正确答案 C 2 单选 集成测试对系统内部的交互以及集成后系统功能检验了哪一种质量特性 A
  • 基本的图算法

    基本的图算法主要是两个方面 图的表示和图的搜索 我们主要通过邻接链表和邻接矩阵对图进行表示 但是在图算法更重要的是图的搜索 图的搜索指的是系统化的跟随图中的边来访问图中的每个节点 我们可以通过图的搜索算法发现图的结构 或者换个方面想图的算法
  • 这是一篇新样式**就是一些有特殊含义的字符,

    新的东西1所谓所谓特殊字符 就是一些有特殊含义的字符 如上面说的 runoo b 中的 简单的说就是表示任何字符串的意思 如果要查找字符串中的 符号 则需要对 进行转义 即在其前加一个 runo ob 匹配字符串 runoob 许多元字符要
  • 国内敏捷项目管理软件-Leangoo领歌敏捷看板工具

    Leangoo领歌是一款专业的敏捷开发管理工具 提供端到端敏捷研发管理解决方案 涵盖敏捷需求管理 任务协同 进展跟踪 统计度量等 Leangoo领歌上手快 实施成本低 可帮助企业快速落地敏捷 提质增效 缩短周期 加速创新 Leangoo领歌
  • matlab RANSAC拟合二维圆(详细过程版)

    RANSAC 一 算法原理 1 算法流程 二 代码实现 三 结果展示 四 测试数据 一 算法原理 1 算法流程 从数据集中随机选择三个点 使用这些点来计算圆心和半径 对于每个数据点 计算其到估计的圆的距离 如果距离小于给定的阈值 则将该点视
  • 给windows设置定时任务并运行py脚本

    想要每天定时执行py脚本 可以试试windows自带的 第一步 找到控制面板 系统和安全 管理工具 计划任务 第二步 创建基本任务 第三步 给任务取个名字 第四步 根据需求选择执行频率 第五步 设置时间和触发频率 第六步 启动程序 第七步
  • Ubantu下Linux动态IP和静态IP配置方法

    Ubantu Linux动态Ip和静态Ip配置方法 一 动态Ip配置 二 网络配置文件 1 进入网络配置文件 2 静态Ip和动态Ip的修改 3 修改inerfaces文件后需要进入DNS文件添加域名Ip 三 重启网络 让其配置生效 四 使用
  • 【自学C++】C++转义字符

    C 转义字符 C 转义字符教程 在编程中有一些字符是打不出来的 比如换行 提示音 下一个制表位等等 于是程序语言的开发者就设计了转义序列 escape sequence 这种东西用来表达这些字符 所谓转义 可以理解为 采用某些方式暂时取消该
  • Openstack CLI命令管理私有云主机实战(附OpenStack实验环境)

    1 Openstack CLI 命令行管理入门 查看nova云主机 nova list ERROR CommandError You must provide a username or user ID via os username os
  • “华为杯”研究生数学建模竞赛2004年-【华为杯】D题:研究生录取问题的双向选择策略(附一等奖获奖论文)

    赛题描述 根据素质教育和培养高素质合格人才的要求 目前各学校都对硕士研究生的录取方法进行改革 即在录取的过程中改变了以往根据考试成绩定终身的做法 加大了复试的作用 一般是根据初试的成绩 在达到国家和学校分数线的学生中从高分到低分排序 按1
  • 读《洞穴奇案》——从虐猫到禁食狗肉,自然法真的存在吗?

    这是读 洞穴奇案 的第四篇心得体会 本篇的题目一下子就包含了两个热点话题 高校学生虐猫案 和 立法禁止吃狗肉 这两个事件不得不说是争议不断的 从理性和感性的角度出发得出的结论不一而足 如果此人像探险者一样并没有邪恶的意图 而我们判他有罪 判
  • 什么是U-Boot以及如何下载U-Boot源码

    参考 什么是U Boot以及如何下载U Boot源码 作者 一只青木呀 发布时间 2020 10 20 11 05 59 网址 https blog csdn net weixin 45309916 article details 1091
  • 谷歌地图api訪问失败

    在非外网情况下 我们调用谷歌api会出现载入不到地图的现象 此时能够换一下域名试试或许就好了 比方我自己訪问api时时这样写的 https maps googleapis com maps api js key sensor true 此时
  • Java中Iterator和Iterable的区别

    iterator为Java中的迭代器对象 是能够对List这样的集合进行迭代遍历的底层依赖 iterable接口里定义了返回iterator的方法 相当于对iterator的封装 同时实现了iterable接口的类可以支持forEach循环