Iterator(迭代器)遍历Collection集合元素

Iterator(迭代器)是一个接口,它的作用就是遍历容器的所有元素,也是 Java 集合框架的成员,但它与 Collection 和 Map 系列的集合不一样,Collection 和 Map 系列集合主要用于盛装其他对象,而 Iterator 则主要用于遍历(即迭代访问)Collection 集合中的元素。

Iterator 接口隐藏了各种 Collection 实现类的底层细节,向应用程序提供了遍历 Collection 集合元素的统一编程接口。Iterator 接口里定义了如下 4 个方法。

	boolean hasNext():如果被迭代的集合元素还没有被遍历完,则返回 true。Object next():返回集合里的下一个元素。void remove():删除集合里上一次 next 方法返回的元素。void forEachRemaining(Consumer action):这是 Java 8 为 Iterator 新增的默认方法,该方法可使用 Lambda 表达式来遍历集合元素。

通过 Iterator 接口来遍历集合元素。

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;public class IteratorTest {public static void main(String[] args) {// 创建一个集合Collection objs = new HashSet();objs.add("Java教程");objs.add("C语言教程");objs.add("python教程");// 调用forEach()方法遍历集合// 获取books集合对应的迭代器Iterator it = objs.iterator();while (it.hasNext()) {// it.next()方法返回的数据类型是Object类型,因此需要强制类型转换String obj = (String) it.next();System.out.println(obj);if (obj.equals("百度C语言")) {// 从集合中删除上一次next()方法返回的元素it.remove();}// 对book变量赋值,不会改变集合元素本身obj = "百度Python语言";}System.out.println(objs);}
}

从上面代码中可以看出,Iterator 仅用于遍历集合,如果需要创建 Iterator 对象,则必须有一个被迭代的集合。没有集合的 Iterator 没有存在的价值。

注意:Iterator 必须依附于 Collection 对象,若有一个 Iterator 对象,则必然有一个与之关联的 Collection 对象。Iterator 提供了两个方法来迭代访问 Collection 集合里的元素,并可通过 remove() 方法来删除集合中上一次 next() 方法返回的集合元素。

当使用 Iterator 迭代访问 Collection 集合元素时,Collection 集合里的元素不能被改变,只有通过 Iterator 的 remove() 方法删除上一次 next() 方法返回的集合元素才可以,否则将会引发“java.util.ConcurrentModificationException”异常。下面程序示范了这一点。

public class IteratorErrorTest {public static void main(String[] args) {// 创建一个集合Collection objs = new HashSet();objs.add("百度Java教程");objs.add("百度C语言教程");objs.add("百度C++教程");// 获取books集合对应的迭代器Iterator it = objs.iterator();while (it.hasNext()) {String obj = (String) it.next();System.out.println(obj);if (obj.equals("百度C++教程")) {// 使用Iterator迭代过程中,不可修改集合元素,下面代码引发异常objs.remove(obj);}}}
}

输出结果为:

百度C++教程
Exception in thread "main" java.util.ConcurrentModificationExceptionat java.util.HashMap$HashIterator.nextNode(Unknown Source)at java.util.HashMap$KeyIterator.next(Unknown Source)at IteratorErrorTest.main(IteratorErrorTest.java:15)

第 15 行代码位于 Iterator 迭代块内,也就是在 Iterator 迭代 Collection 集合过程中修改了 Collection 集合,所以程序将在运行时引发异常。

Iterator 迭代器采用的是快速失败(fail-fast)机制,一旦在迭代过程中检测到该集合已经被修改(通常是程序中的其他线程修改),程序立即引发 ConcurrentModificationException 异常,而不是显示修改后的结果,这样可以避免共享资源而引发的潜在问题。

	快速失败(fail-fast)机制,是 Java Collection 集合中的一种错误检测机制。

注意:上面程序如果改为删除“百度C语言教程”字符串,则不会引发异常。对于 HashSet 以及后面的 ArrayList 等,迭代时删除元素都会导致异常。只有在删除集合中的某个特定元素时才不会抛出异常,这是由集合类的实现代码决定的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564795.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java inputstream read_20191209-java部分流处理

流:流一般分为输入流(InputStream)和输出流(OutputStream)两类.但这种划分并不是绝对的.在Java开发环境中,主要是由包http://java.io中提供的一系列的类和接口来实现输入和输出处理.标准输入和输出处理则是由包java.lang中提供的类来处理的,但这些类又都是从包http://java.io中…

平稳序列的预测和拟合之模型识别

目录 1.计算样本相关系数和偏自相关系数 2.模型识别 模型定阶的困难 样本相关系数的近似分布及模型定阶经验方法 例题: 2.参数估计 常用估计方法: 1.矩估计 2.极大似然估计 3.最小二乘估计 R中,参数估计用arima函数 例题 小结 1.计算…

python自增_Python的自增运算与Python变量的浅析

一、关于Python的自增运算 学了C/C后再学习Python,不自觉地就打出了自增运算符,但是发现Python解释器不认识,查了下资料,发现Python中没有这个运算符。这里暂时不探讨自增运算符的内部实现原理,从语言设计角度来说&…

使用Lambda表达式遍历Iterator迭代器

Java 8 为 Iterator 引入了一个 forEachRemaining(Consumer action) 默认方法,该方法所需的 Consumer 参数同样也是函数式接口。当程序调用 Iterator 的 forEachRemaining(Consumer action) 遍历集合元素时,程序会依次将集合元素传给 Consumer 的 accept…

平稳序列的预测和拟合之模型检验

目录 1.模型的显著性检验 R语言实现 例题 2.参数显著性检验 例题 小结 1.模型的显著性检验 检验模型的有效性(对信息的提取是否充分) 判定原则: 一个好的拟合模型应该能够提取几乎所有的样本相关信息,即残差序列应该为白噪声序列。反之…

oracle数据如何获取游标中动态字段_原来Python自带了数据库,用起来真方便!

Python大数据分析记录 分享 成长Python作为数据科学主流语言,被广泛用于数据读存、处理、分析、建模,可以说是无所不能。数据一般存放在本地文件或者数据库里,之前介绍过如何使用python读取本地文件,也对# PyMySQL、cx_Oracle…

使用foreach循环遍历Collection集合

使用 Java 5 提供的 foreach 循环迭代访问集合元素,而且更加便捷。示范了使用 foreach 循环来迭代访问集合元素。 public class ForeachTest {public static void main(String[] args) {// 创建一个集合Collection objs new HashSet();objs.add("百度Java教程…

平稳序列的预测和拟合之模型优化

目录 前提 准则 1、AIC准则 2、SBC &#xff08;BIC)准则 优化 小结 前提 问题提出:模型通过检验&#xff0c;说明是有效的&#xff0c;但有效的模型不唯一。 下面我们用一个例子来解释一下&#xff1a; 例4-7:试对某次化学反应的70个过程数据序列进行拟合。 d<-r…

css中如何实现帧布局_浅谈web前端中的表格布局与CSS盒子布局

在web前端设计排版时我们可能会用到表格布局和divCSS布局&#xff0c;但现在主要使用后者&#xff0c;为何&#xff1f;今天我们来谈一谈两者之间的发展和原理。话不多说下面来干货发展过程上个世纪Web开发人员流行使用表格进行文档整体布局。因为当时大部分浏览器不支持CSS&am…

使用Predicate操作Collection集合

Java 8 起为 Collection 集合新增了一个 removeIf(Predicate filter) 方法&#xff0c;该方法将会批量删除符合 filter 条件的所有元素。该方法需要一个 Predicate 对象作为参数&#xff0c;Predicate 也是函数式接口&#xff0c;因此可使用 Lambda 表达式作为参数。 示例使用…

油猴的简介和安装

目录 1.油猴简介 2.油猴插件安装 方法1 方法2 3.获取油猴脚本 4.脚本的使用 4.1 脚本的设置及功能 4.2 安装油猴脚本 4.3 新建脚本 5.脚本编写方法 功能注释 脚本权限 编写脚本 1.油猴简介 油猴脚本是一款免费的浏览器扩展和最为流行的用户脚本管理器&#xff0c…

Logistic回归——二分类 —— matlab

目录 1.简介 2.应用范围 3.分类 3.应用条件 4.原理详解 4.1 sigmod分类函数 4.2 建立目标函数 4.3 求解相关参数 5.实列分析 5.1 读取数据&#xff08;excel文件&#xff09; 5.2 分离数据集 5.3 求解前设定 5.4 求解目标函数 5.5 预测 5.6 预测分类 5.7 准确率…

java 抽象类_java中的抽象类

普通类可以直接产生实例化对象&#xff0c;并且在普通类之中可以包含有构造方法、普通方法、static方法、常量、变量的内容。而所谓的抽象类就是指在普通类的结构里面增加抽象方法的组成部分&#xff0c;抽象方法指的是没有方法体的方法&#xff0c;同时抽象方法还必须使用abst…

Stream操作Collection集合

独立使用 Stream 的步骤如下&#xff1a; 1 . 使用 Stream 或 XxxStream 的 builder() 类方法创建该 Stream 对应的 Builder。 2 . 重复调用 Builder 的 add() 方法向该流中添加多个元素。 3 . 调用 Builder 的 build() 方法获取对应的 Stream。 4 . 调用 Stream 的聚集方法…

Logistic回归——二分类 —— python

目录 1.简介 2.应用范围 3.分类 3.应用条件 4.原理详解 4.1 sigmod分类函数 4.2 建立目标函数 4.3 求解相关参数 5.实列分析 5.1 导入库 5.2 读取数据&#xff08;excel文件&#xff09; 5.3 分离数据集 5.4 求解前设定 5.5 求解目标函数 5.6 预测 5.7 预测分类…

dubbo官方文档_狂神说SpringBoot17:Dubbo和Zookeeper集成

狂神说SpringBoot系列连载课程&#xff0c;通俗易懂&#xff0c;基于SpringBoot2.2.5版本&#xff0c;欢迎各位狂粉转发关注学习。未经作者授权&#xff0c;禁止转载分布式理论什么是分布式系统&#xff1f;在《分布式系统原理与范型》一书中有如下定义&#xff1a;“分布式系统…

第一个脚本-HelloWorld

目录 前言 脚本的作用 创建脚本 开始编写我们这次的HelloWorld的对话框 前言 我的扩展主要使用:Tampermonkey&#xff0c;当然其他的有类似功能的也可以&#xff0c;我们就将这些统称为油猴吧。 本节主要内容: 描述脚本的作用和油猴,脚本的基本结构,创建一个脚本,使它能够…

bme280 环境传感器开发板_STM32Cube14 | 使用硬件I2C读写环境光强度传感器

更多精彩~点击上面蓝字关注我们呀&#xff01; 寻求更好的阅读体验&#xff0c;请点击阅读原文移步&#xff1a;Mculover666的个人博客。本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I2C外设读取环境光强度传感器数据(BH1750)。1. 准备工作硬件准备开发板首先…

Java查询图书信息

使用泛型集合来实现某图书管理系统的查询功能。 在图书管理系统中为了方便管理图书&#xff0c;将图书划分为几个类别。每个类别下有很多图书&#xff0c;每本图书都有相对应的类别&#xff0c;这就具备了一对多的关系映射&#xff0c;即一个类别对应多本图书。 在这种情况下…

平稳序列的拟合和预测之序列的预测

目录 1.线性预测函数 2.预测方差最小原则 3.线性最小方差预测的性质 AR(p)序列的预测 例题 R语言预测举例 MA(q)序列的预测 例题 ARMA(p,q)序列预测 例题 小结 序列只有为非白噪声时才可以进行预测哦&#xff01;&#xff01; 1.线性预测函数 根据平稳性和可逆性&…