`
cakin24
  • 浏览: 1392050 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

迭代神器-Iterator接口

    博客分类:
  • java
阅读更多

一 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.zip

    开源项目“json-iterator-go”是一个针对Go语言的高性能JSON解析库,它的设计目标是提供与标准库`encoding/json`完全兼容的接口,同时在性能上有所提升。这个压缩包`json-iterator-go.zip`包含了项目的源代码,具体...

    c++ 的array源码分析和reverse-iterator和-Array-const-iterator类

    c++ 的array源码分析和reverse-iterator和-Array-const-iterator类

    前端开源库-async-iterator-all

    `async-iterator-all`是一个非常实用的开源库,专为处理异步迭代器设计,帮助开发者更方便地从异步迭代器中收集所有值并转换成数组。这个库的核心功能是简化了对异步生成器(async generator)的处理,使得异步数据...

    java-util-iterator.pdf java-util-iterator.pdf

    根据提供的文件信息,本文将深入探讨Java中的`java.util.Iterator`接口及其在集合类中的应用。我们将从以下几个方面进行详细解析: ### 一、集合类的根接口:Collection `Collection`接口是Java集合框架的基础,它...

    Laravel开发-multi-level-array-iterator

    `php-multi-level-array-iterator-master`这个项目很可能包含了完整的实现和示例,你可以下载并研究其代码,以获取更多关于如何在Laravel环境中创建和使用多级数组迭代器的详细信息。 总之,理解并掌握Laravel的...

    js-leetcode题解之173-binary-search-tree-iterator.js

    javascript js_leetcode题解之173-binary-search-tree-iterator.js

    分析-Iterator-base12与-Container-base12

    分析-Iterator-base12与-Container-base12

    harmonyos2-lines-async-iterator::left_arrow::right-facing_fist:node.js的懒惰、逐行、文件读取异步迭代器

    行异步迭代器 node.js逐行异步迭代器 使用 ESNext 异步迭代 与--harmony-async-iterator标志一起使用 可以与 IxJS 一起使用 支持自定义承诺 包括打字稿定义 用法 安装 npm install --save lines-async-iterator # or...

    11-Iterator.rar

    2. **迭代器接口**(Iterator Interface):定义了遍历元素的方法,如`hasNext()`用于检查是否还有更多元素,以及`next()`用于返回下一个元素。在Java中,这就是`java.util.Iterator`接口。 3. **具体迭代器**...

    20151910042-刘鹏-DSA思考题-07 - iterator and tree1

    4. 在Java中,`java.lang.Iterable`接口的`iterator()`方法就是从集合对象转换为迭代器对象的关键。例如,List类型的集合可以通过调用`iterator()`方法得到一个迭代器,然后通过迭代器遍历列表的所有元素。 5. 实现...

    开源项目-thrift-iterator-go.zip

    开源项目“thrift-iterator-go.zip”是一个基于Go语言实现的工具,用于解码和编码Thrift消息,而无需依赖Thrift接口定义语言(IDL)。Thrift是一种跨语言的服务开发框架,由Facebook开源,旨在提供高效、轻量级的...

    deque源码分析和类move-iterator,c++的vs2019 ,cpp20语法

    deque源码分析和类move-iterator,c++的vs2019 ,cpp20语法

    implementation-iterator:迭代 PSR-4 兼容目录以实现类接口

    该库为符合 PSR-4 的文件夹结构创建迭代器,并在其中搜索接口/类的所有实现/扩展。 抽象实现和类本身将被忽略。 用法 $ iterator = new \ Scheb \ ImplementationIterator ( "src/" , "Root\Namespace" , "Some\...

    node-stream-to-async-iterator:ES节点流的异步迭代器包装器

    流到异步迭代器概述stream-to-async-iterator提供了一个实现Symbol.asyncIterator的包装器。 这将使流可用作异步可迭代变量,可以在for-await-of循环中使用。 支持node.js 4及更高版本。安装 $ npm install stream-...

    php-file-iterator:FilterIterator实现,该实现基于后缀,前缀和其他排除条件列表来过滤文件

    php文件迭代器 安装 您可以使用将该库作为本地的,基于项目的依赖项添加到您的项目中: composer require phpunit/php-file-iterator 如果仅在开发过程中需要此库(例如,运行项目的测试套件),则应将其添加为开发...

    面向对象程序设计英文教学课件:14-Design-Iterator.pptx

    STL不仅包含了容器,还引入了迭代器(Iterator)的概念,使得遍历这些集合变得更为简便。 迭代器是一种设计模式,它抽象了遍历集合的过程,与底层的存储机制无关。这意味着不论集合如何实现,只要提供了对应的迭代...

    实现节点和迭代器-代码

    一个简单的迭代器接口可能包括`increment`(前进)、`decrement`(后退)、`dereference`(获取当前元素值)和`equality comparison`(判断两个迭代器是否指向同一位置)等操作。 在VS2015中实现一个基本的迭代器,...

    Iterator接口

    Iterator接口和ListIterator接口的使用可以带来很多便利,例如,使用Iterator接口可以遍历集合中的元素,而不管集合的具体实现类型,同时也可以使用ListIterator接口来控制迭代器的行为,例如,添加或删除元素。...

Global site tag (gtag.js) - Google Analytics