迭代器(Iterator)

Java 入门指南:迭代器(Iterator) 迭代器(Iterator) 是一种行为型设计模式,属于设计模式之一,迭代器模式提供了一种方法来顺序访问一个聚合对象(如List、Set等)中各个元素,而不需要暴露该对象的内部表示。 阅读详情

迭代器(Iterator)是一个对象,它的工作是遍历并选择序列中的对象,它提供了一种访问一个容器(container)对象中的各个元素,而又不必暴露该对象内部细节的方法。通过迭代器,开发人员不需要了解容器底层的结构,就可以实现对容器的遍历。由于创建迭代器的代价小,因此迭代器通常被称为轻量级的容器。


迭代器的使用主要有以下三个方面的注意事项:

1)使用容器的iterator()方法返回一个Iterator,然后通过Iterator的next()方法返回第一个元素。

2)使用Iterator()的hasNext()方法判断容器中是否还有元素,如果有,可以使用next()方法获取下一个元素。

3)可以通过remove()方法删除迭代器返回的元素。


Iterator支持派生的兄弟成员。ListIterator只存在于List中,支持在迭代期间向List中添加或删除元素,并且可以在List中双向滚动。


Iterator的使用方法如下例所示:

package com.js;
/**
 * Iterator使用Demo
 */
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class Test {
	public void main(String[] args){
		List<String> ll = new LinkedList<String>();
		ll.add("first");
		ll.add("second");
		ll.add("third");
		ll.add("fourth");
		for(Iterator<String> iterator = ll.iterator();iterator.hasNext();){
			String string = (String)iterator.next();
			System.out.println(string);
		}
	}
}

运行结果为:

first
second
third
fourth


使用iterator()方法时经常会遇到ConcurrentModificationException异常,这通常是由于在使用Iteraor遍历容器的同时又对容器做增加或删除操作所导致的,或者由于多线程操作导致,当一个线程使用迭代器遍历容器的同时,另外一个线程对这个容器进行增加或删除操作。下列主要介绍单线程抛出ConcurrentModificationException的情况:

package com.js;
/**
 * Iterator使用Demo
 */
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class Test {
	public void main(String[] args){
		List<String> ll = new LinkedList<String>();
		ll.add("first");
		ll.add("second");
		ll.add("third");
		ll.add("fourth");
		for(Iterator<String> iterator = ll.iterator();iterator.hasNext();){
			String string = (String)iterator.next();
			System.out.println(string);
			if(string.equals("second"))
				ll.add("fifth");
		}
	}
}


运行结果为:

first
second
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.LinkedList$ListItr.checkForComodification(Unknown Source)
at java.util.LinkedList$ListItr.next(Unknown Source)
at com.js.Test.main(Test.java:17)

抛出上述异常的主要原因是当条用容器的iterator()方法返回Iterator对象时,把容器中包含对象的个数赋值给了一个变量expectedModCount,在调用next()方法时会比较变量expectedModCount与容器中实际对象的个数modCount的值是否相等,若二者不相等,则会抛出ConcurrentModificationException异常,因此在使用Iterator遍历容器的过程中,如果对容器进行增加或删除操作,就会改变容器中对象的数量,从而导致抛出异常。解决办法如下:在遍历的过程中把需要删除的对象保存到一个集合中,等遍历结束后再调用removeAll()方法来删除,或者使用iterator.remove()方法。


以上主要介绍了单线程的解决方案,那么多线程访问容器的过程中抛出ConcurrentModificationException异常了又该怎么解决呢?

1)在JDK1.5版本引入了线程安全的容器,比如ConcurrentHashMap和CopyOnWriteArrayList等。可以使用这些线程安全的容器来代替非线程安全的容器。

2)在使用迭代器遍历容器时对容器的操作放到synchronized代码块中,但是当引用程序并发程度比较高时,这会严重影响程序的性能。


引申:Iterator和ListIterator有什么区别?

Iterator只能正向遍历集合,适用于获取移除元素。ListIterator继承自Iterator,专门针对List,可以从两个方向来遍历List,同时支持元素的修改。

C++迭代器iterator详解 知识的学习在于点滴记录,坚持不懈;知识的学习要有深度和广度,不能只流于表面,坐井观天;知识要善于总结,不仅能够理解,更知道如何表达! 目录迭代器概念iterator迭代器实现容器迭代器失效问题const_iterator迭代器实现reverse_iterator迭代器实现const_reverse_iterator迭代器实现insert插入型迭代器流迭代器 迭代器概念 最近有人春招面试互联网大... 阅读详情

相关推荐

迭代器Iterator接口

集合框架中遍历list是比较方便的,我们只需有一个for循环即可遍历list中的所有元素,因为list是有序的,而set是无序的,那么如何遍历set集合呢?就需要用到Iterator对象了,Iterator对象称作迭代器,来实现对容器内元素的遍历。 Iterator接口包含三个方法,hasNext(),next(),remove() 下面解释来自API JDK1.6 集合Collect

Bazingaea的博客 2023

迭代器(iterator)看这篇就够了

迭代器很重要,是遍历线性数据结构(链表)的重要方法之一。迭代器仅仅是遍历输出语句!本身并没有任何排序等其他功能,在数据结构的二叉树中别认为迭代器输出二叉树是因为迭代器会排序,是因为排序二叉树本身有序,迭代器仅仅是按照排序二叉树本身的排序规则输出罢了。

若葉的博客 10万+

String对象的迭代器iterator实现

class String { public: String(const char *p = nullptr) { if (p != nullptr) { _pstr = new char[strlen(p) + 1]; strcpy(_pstr, p); } else { _pstr = new char[1]; *_

mlc741295821的博客 1062

迭代器详解

仅此一文小白也能完全理解迭代器!笔者按照自身学习思路,破解每一个疑惑!可迭代对象?迭代器?__iter__方法?__next__方法?里面都有,内附有代码证明与实例!

LU_ZE_XX的博客 6569

yolo自动化项目实例解析(九) 导航

比如我们经常使用的导航,说白了就是寻找两点之间最近的路径,也就是所谓的寻路,我们需要想办法让程序知道他要去哪里,路径包含(起点、轨迹、路径)

默子昂 1998

Cadence SIP Layout 简单教程-第二章

[从whp1920 网易博客迁移至优快云] 第一章在正式布线之前做了必须做的准备工作,下面进入正题,打开Candence SIP RF Layout GXL软件。 第一节 导入外形尺寸 打开SIP设置文件保存路径,如下图所示进入导入DXF页面,选中前一章时画好的外框图。打开导入界面后,再进入DXF In Edit/View Layers界面选择所有层,导入Class选择DRAWING FOR...

whp1920的博客 6940

▲什么是迭代器?迭代器有什么作用?

什么是迭代器? 先说说它是干嘛的吧!迭代器的作用是用来访问容器(用来保存元素的数据结构)中的元素,所以使用迭代器,我们就可以访问容器中里面的元素。没错!这和访问数组这个序列的指针一样,因为数组范围内的指针就是迭代器的一种。 指针和迭代器有什么区别呢? 1.指针针是C语言里面就有的东西,而迭代器是C++里面才有的 2.指针用起来灵活,效率高。迭代器功能更丰富一些 3.指针通常用来访问的是序列的元素,但不是所有的容器都会在连续的内存空间上保存数据。所以,对于这些容器我们不能单纯地使用指针作为迭代器,而

phantomthief1412的博客 3万+

【虚幻引擎】UE4初学者系列教程基础篇-全中文新手入门教程(UE5系列继续更新)

菜单栏菜单栏当中有文件、编辑、窗口帮助。文件当中可以进行一个关卡的新建、关卡的打开、关卡的保存还有就是打包项目,(项目大于关卡,项目里面可能有几百个关卡),这是比较常用的几个,这里可以看到打包当中有安卓端HTML5端,IOS端linux,还有就是TVOS(苹果电视)、windows的一些端口的一些设置。还可以打开最近打开的项目。关卡编辑器:工具栏3.3 “模式”面板保存所有:ctrl+shift+s(有的软件截屏也是这个按键需要注意)3.4 “内容浏览器”面板缩放:ctr+鼠标滚轮3.5.视口面板。

qq_45206556的博客 2万+

C++迭代器 iterator详解

它提供了一种访问容器(如列表、集合等)中元素的方法,而无需暴露容器的内部表示。迭代器使得程序员能够以统一的方式遍历不同的数据结构,而无需关心这些数据结构的具体实现细节。类似于指针指向对应的元素并且能对这个元素进行修改和使用。

a1275174052的博客 4198

5分钟搞懂SCMA:稀疏码多址接入的核心原理与实战应用

本文深入浅出地解析了SCMA(稀疏码多址接入)的核心原理与实战应用。通过对比传统正交多址技术,阐释了SCMA如何通过非正交叠加和稀疏码本设计,实现远超资源单元数的用户接入,从而有效应对5G海量机器通信(mMTC)的挑战。文章还探讨了其在上行海量连接、免授权接入等场景的应用潜力及工程实现中的关键考量。

zeta9的博客 264

YOLOv11改进有效涨点专栏目录 | 含卷积、主干、注意力机制、Neck、检测头、损失函数、二次创新C2PSA/C3k2等各种网络结构改进

Hello,各位读者们好.本文为最新YOLOv11有效涨点专栏目录,YOLOv11以及发布了一个月左右,这个过程中我也是给大家整理了许多的机制,其中包含了C3k2、主干(均支持根据yolov11训练的版本进行二次缩放,全系列都能轻量化)、检测头、注意力机制、Neck多种结构上创新,也有损失函数和一些细节点上的创新。

Snu77的博客 8万+

Iterator迭代器

1.迭代器的概述 迭代器:是一种通用的遍历集合,取出集合中元素的方式 迭代器由来: 集合有很多种,每种集合的数据结构是不同的(数组,链表,哈希表…),集合取出元素的方式也不同 我们不可能为每种集合都定义一种取出元素的方式,浪费 所以我们就可以使用迭代器,是集合通用的取出元素的方式 迭代器取出元素的原理: 判断集合中还有没有元素,有就取出来 再判断集合中还有没有元素,有再取出来 一直判断到集合中没有元素为止,这种取出元素的方式叫迭代 java.util.Iterator接口:对 collection 进

weixin_44784393的博客 2668

【C语言学习疑难杂症】第20期:0x00007FF7F2821964处引发的异常0xC0000005写入位置 0x0000000000000

检查代码中是否存在野指针访问的情况,确保在进行写入操作之前,内存已经被正确分配或初始化,并且在使用完毕后进行了正确的释放。空指针访问:代码尝试在空指针地址(0x0000000000000000)处进行写入操作,导致访问冲突。检查代码中是否存在数组越界的情况,确保在进行写入操作之前,数组的索引值在合法范围内。检查代码中是否存在空指针访问的情况,确保在进行写入操作之前,指针已经被正确初始化。野指针访问:代码尝试在已释放或未初始化的内存地址进行写入操作,导致访问冲突。

学无止境 828

scala的ITERATOR迭代器

ITERATOR迭代器 scala针对每一类集合都提供了一个迭代器(iterator)用来迭代访问集合 使用迭代器遍历集合 使用iterator方法可以从集合获取一个迭代器 迭代器的两个基本操作 hasNext——查询容器中是否有下一个元素 next——返回迭代器的下一个元素,如果没有,抛出NoSuchElementException 每一个迭代器都是有状态的 迭代完后保留在最后一个元素的位置 再...

汉子一枚 1165

深度拆解 ‘High-Frequency Trading’ (HFT) 系统:解析如何在 100 纳秒内完成从网卡到 C++ 策略的响应

在100纳秒内完成从网卡到C++策略的响应,这是一项对技术栈每一个层面都进行极限优化的系统工程。它要求我们深入理解计算机体系结构、操作系统、网络协议和C++语言的底层机制。从物理距离的极致缩短,到高性能网卡和内核旁路技术,再到C++代码中每一个字节、每一个CPU周期的精打细算,HFT系统展现了人类对计算速度的永恒追求。这项技术不仅仅应用于金融交易,其背后的低延迟理念和实现方法,如DPDK、无锁编程、硬件加速等,正在逐渐渗透到其他对延迟敏感的领域,例如电信网络、边缘计算和工业自动化。

weixin_41455464的博客 1039

Pre-suite 开发之MFi功能搭建

Pre-suite 固件中只有带无线硬件的Ezairo 7160sl才具备无线通信能力,其无线功能包括标准BLE 5.2 低功耗蓝牙功能以及非标准的低功耗无线音频流功能。Ezairo 7160sl 支持3种低功耗无线音频流协议:来自APPLE的MFi,来自Google的ASHA以及来自onsemi的remote mic。其中MFi音频流走的G.722编码的Mode1,速率为64kbps;而非MFi音频流走的G.722的Mode3,速率为48kbps.

SnowYang2017的博客 1506

Java——迭代器iterator详解

一、Iterator的API       关于Iterator主要有三个方法:hasNext()、next()、remove()       hasNext:没有指针下移操作,只是判断是否存在下一个元素       next:指针下移,返回该指针所指向的元素       remove:删除当前指针所指向的元素,一般和next方法一起用,这时候的作用就是删除next方法返回的元素   二...

qq_36470686的博客 2965

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java Iterator(迭代器)

1.综合了解概念 为了方便的处理集合中的元素,Java中出现了一个对象,该对象提供了一些方法专门处理集合中的元素.例如删除和获取集合中的元素.该对象就叫做迭代器(Iterator). 对 Collection 进行迭代的类,称其为迭代器。还是面向对象的思想,专业对象做专业的事情,迭代器就是专门取出集合元素的对象。但是该对象比较特殊,不能直接创建对象(通过new),该对象是以内部类的形式存在于每个集合类的内部。 如何获取迭代器?Collection接口中定义了获取集合类迭代器的方法(iterator()

weixin_50526050的博客 5368

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

迭代器 Iterator 是什么

迭代器 Iterator 是什么? 首先说一下迭代器模式,它是 Java 中常用的设计模式之一。用于顺序访问集合对象的元素,无需知道集合对象的底层实现。 Iterator 是可以遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦。 缺点是增加新的集合类需要对应增加新的迭代器类,迭代器类与集合类成对增加。 【Java面试题与答案】整理推荐...

ConstXiong 2万+

迭代器Iterator

迭代器Iterator接口 在程序开发过程中,经常需要遍历集合当中的所有元素,针对这种情况,JDK官方又提供了一个接口java.util.Iterator。Iterator接口它也是集合当中的一员,但是它与Map、Collection接口不同,Collection接口和Map接口它主要是用来存储元素的,而Iterator主要是用于迭代访问Collection与Map接口当中的元素。因此我们也经常把Iterator对象称为迭代器。 想要遍历Collection集合当中的元素,首先需要获取该集合的迭代器,通过迭

weixin_45875345的博客 181

java 迭代器 iterator_java 迭代器iterator

迭代器(Iterator)迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。Java中的Iterator功能比较简单,并且只能单向移动:(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:itera...

weixin_29468561的博客 295

迭代器 Iterator 是什么?

Iterator是 Java 集合框架中遍历集合的核心工具,它通过一组简单的方法使得集合元素的访问和操作变得更加灵活和安全。在实际开发中,Iterator可以帮助开发者以统一的方式处理不同类型的集合。听忆.-优快云博客🎈众口难调🎈从心就好。

边走、边悟、迟早变好 1001
上一篇: Java异常处理、异常处理使用的一些注意点(例如,基类和子类捕获的顺序问题)
下一篇: "=="、equals和hashCode有什么区别
Yes_JiangShuai
博客等级 码龄10年 149粉丝 249原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值