一 Iterator接口基础
1 Iterator接口概述
Iterator接口也是Java集合框架的成员,但它与Collection系列、Map系列的集合不一样:Collection系列集合、Map系列集合主要用于盛装其他对象,而Iterator则主要用于遍历(即迭代访问)Collection集合中的元素,Iterator对象也被称为迭代器。
2 Iterator接口定义的4个方法
boolean hasNext():如果被迭代的集合,元素还有没被遍历完,则返回true。
Object next():返回集合里下一个元素。
void remove():删除集合里上一次next方法返回的元素。
void forEachRemaining(Consumer action),这是Java 8为Iterator新增的默认方法,该方法可使用Lambda表达式来遍历集合元素。
二 正确代码演示
1 代码示例
import java.util.*; public class IteratorTest { public static void main(String[] args) { Collection books = new HashSet(); books.add("现代操作系统"); books.add("Java典型应用"); books.add("TCP/IP协议"); // 获取books集合对应的迭代器 Iterator it = books.iterator(); while(it.hasNext()) { // it.next()方法返回的数据类型是Object类型,因此需要强制类型转换 String book = (String)it.next(); System.out.println(book); if (book.equals("Java典型应用")) { // 从集合中删除上一次next方法返回的元素 it.remove(); } // 对book变量赋值,不会改变集合元素本身 book = "测试字符串"; //① } System.out.println(books); } }
2 运行结果
Java典型应用
现代操作系统
TCP/IP协议
[现代操作系统, TCP/IP协议]
3 代码说明
上面程序中①行代码对迭代变量book进行赋值,但再次输出books集合时,会看到集合里的元素没有任何变化。这就可以得出一个结论:当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给迭代
变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本身没有影响。
三 错误代码演示
1 代码示例
import java.util.*; public class IteratorErrorTest { public static void main(String[] args) { Collection books = new HashSet(); books.add("JSP"); books.add("Linux"); books.add("C++"); // 获取books集合对应的迭代器 Iterator it = books.iterator(); while(it.hasNext()) { String book = (String)it.next(); System.out.println(book); if (book.equals("Linux")) { // 使用Iterator迭代过程中,不可修改集合元素,下面代码引发异常 books.remove(book); } } } }
2 运行结果
C++
Linux
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1437)
at java.util.HashMap$KeyIterator.next(HashMap.java:1461)
at IteratorErrorTest.main(IteratorErrorTest.java:18)
3 代码分析
books.remove(book); 位于迭代块内,也就是在Iterator迭代Collection集合过程中修改了Collection集合,所以程序将在运行时引发异常。
相关推荐
开源项目“json-iterator-go”是一个针对Go语言的高性能JSON解析库,它的设计目标是提供与标准库`encoding/json`完全兼容的接口,同时在性能上有所提升。这个压缩包`json-iterator-go.zip`包含了项目的源代码,具体...
c++ 的array源码分析和reverse-iterator和-Array-const-iterator类
`async-iterator-all`是一个非常实用的开源库,专为处理异步迭代器设计,帮助开发者更方便地从异步迭代器中收集所有值并转换成数组。这个库的核心功能是简化了对异步生成器(async generator)的处理,使得异步数据...
根据提供的文件信息,本文将深入探讨Java中的`java.util.Iterator`接口及其在集合类中的应用。我们将从以下几个方面进行详细解析: ### 一、集合类的根接口:Collection `Collection`接口是Java集合框架的基础,它...
`php-multi-level-array-iterator-master`这个项目很可能包含了完整的实现和示例,你可以下载并研究其代码,以获取更多关于如何在Laravel环境中创建和使用多级数组迭代器的详细信息。 总之,理解并掌握Laravel的...
javascript js_leetcode题解之173-binary-search-tree-iterator.js
分析-Iterator-base12与-Container-base12
行异步迭代器 node.js逐行异步迭代器 使用 ESNext 异步迭代 与--harmony-async-iterator标志一起使用 可以与 IxJS 一起使用 支持自定义承诺 包括打字稿定义 用法 安装 npm install --save lines-async-iterator # or...
2. **迭代器接口**(Iterator Interface):定义了遍历元素的方法,如`hasNext()`用于检查是否还有更多元素,以及`next()`用于返回下一个元素。在Java中,这就是`java.util.Iterator`接口。 3. **具体迭代器**...
4. 在Java中,`java.lang.Iterable`接口的`iterator()`方法就是从集合对象转换为迭代器对象的关键。例如,List类型的集合可以通过调用`iterator()`方法得到一个迭代器,然后通过迭代器遍历列表的所有元素。 5. 实现...
开源项目“thrift-iterator-go.zip”是一个基于Go语言实现的工具,用于解码和编码Thrift消息,而无需依赖Thrift接口定义语言(IDL)。Thrift是一种跨语言的服务开发框架,由Facebook开源,旨在提供高效、轻量级的...
deque源码分析和类move-iterator,c++的vs2019 ,cpp20语法
该库为符合 PSR-4 的文件夹结构创建迭代器,并在其中搜索接口/类的所有实现/扩展。 抽象实现和类本身将被忽略。 用法 $ iterator = new \ Scheb \ ImplementationIterator ( "src/" , "Root\Namespace" , "Some\...
流到异步迭代器概述stream-to-async-iterator提供了一个实现Symbol.asyncIterator的包装器。 这将使流可用作异步可迭代变量,可以在for-await-of循环中使用。 支持node.js 4及更高版本。安装 $ npm install stream-...
php文件迭代器 安装 您可以使用将该库作为本地的,基于项目的依赖项添加到您的项目中: composer require phpunit/php-file-iterator 如果仅在开发过程中需要此库(例如,运行项目的测试套件),则应将其添加为开发...
STL不仅包含了容器,还引入了迭代器(Iterator)的概念,使得遍历这些集合变得更为简便。 迭代器是一种设计模式,它抽象了遍历集合的过程,与底层的存储机制无关。这意味着不论集合如何实现,只要提供了对应的迭代...
一个简单的迭代器接口可能包括`increment`(前进)、`decrement`(后退)、`dereference`(获取当前元素值)和`equality comparison`(判断两个迭代器是否指向同一位置)等操作。 在VS2015中实现一个基本的迭代器,...
Iterator接口和ListIterator接口的使用可以带来很多便利,例如,使用Iterator接口可以遍历集合中的元素,而不管集合的具体实现类型,同时也可以使用ListIterator接口来控制迭代器的行为,例如,添加或删除元素。...