深入理解Java的迭代器Iterator

海康威视一面:Iterator与Iterable有什么区别? 那天,小二去海康威视面试,面试官老王一上来就甩给了他一道面试题:请问 Iterator与Iterable有什么区别?小二差点笑出声,因为一年前,也就是 2021 年,他在《Java 程序员进阶之路》专栏上的第 62 篇看到过这题????。 PS:星标这种事,只能求,不求没效果,come on。《Java 程序员进阶之路》在 GitHub 上已经收获了 460 枚星标,小伙伴们赶紧去点点了,冲 500! https://github.com/itwanger/toBeBetterJavaer 在 Jav 阅读详情

先看一段代码:

package com.thinking4java;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ListModifyDemo {

	public static void main(String[] args) {
		List<Integer> list = new ArrayList<Integer>();
		list.add(10);
		list.add(20);
		list.add(30);
		Iterator<Integer> iter = list.iterator();
		while (iter.hasNext()) {
			Integer next = iter.next();
			System.out.println("next=" + next);
			list.add(40);
		}
	}
}

next=10
Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
	at java.util.AbstractList$Itr.next(AbstractList.java:343)
	at com.thinking4java.ListModifyDemo.main(ListModifyDemo.java:16)

Iterator的工作机制。Iterator是工作在一个独立的线程中,并且拥有一个 mutex锁,就是说Iterator在工作的时候,是不允许被迭代的对象被改变的。Iterator被创建的时候,建立了一个内存索引表(单链表),这 个索引表指向原来的对象,当原来的对象数量改变的时候,这个索引表的内容没有同步改变,所以当索引指针往下移动的时候,便找不到要迭代的对象,于是产生错 误。List、Set等是动态的,可变对象数量的数据结构,但是Iterator则是单向不可变,只能顺序读取,不能逆序操作的数据结构,当 Iterator指向的原始数据发生变化时,Iterator自己就迷失了方向。

再回过头看下List迭代器的源码:

……

public Iterator<E> iterator() {
	return new Itr();
}
private class Itr implements Iterator<E> {
		/**
		 * Index of element to be returned by subsequent call to next.
		 */
		int cursor = 0;

		/**
		 * Index of element returned by most recent call to next or previous.
		 * Reset to -1 if this element is deleted by a call to remove.
		 */
		int lastRet = -1;

		/**
		 * The modCount value that the iterator believes that the backing List
		 * should have. If this expectation is violated, the iterator has
		 * detected concurrent modification.
		 */
		int expectedModCount = modCount;

		public boolean hasNext() {
			return cursor != size();
		}

		public E next() {
			checkForComodification();
			try {
				E next = get(cursor);
				lastRet = cursor++;
				return next;
			} catch (IndexOutOfBoundsException e) {
				checkForComodification();
				throw new NoSuchElementException();
			}
		}

		public void remove() {
			if (lastRet == -1)
				throw new IllegalStateException();
			checkForComodification();

			try {
				AbstractList.this.remove(lastRet);
				if (lastRet < cursor)
					cursor--;
				lastRet = -1;
				expectedModCount = modCount;
			} catch (IndexOutOfBoundsException e) {
				throw new ConcurrentModificationException();
			}
		}

		final void checkForComodification() {
			//此处的modCount是Itr的外部类即:AbstractList的属性(protected transient int modCount = 0;)
			if (modCount != expectedModCount)
				throw new ConcurrentModificationException();
		}
	}


Linux-ftrace-双nop机制的实现 linux-ftrace内核追踪-双nop机制的实现原理 阅读详情

相关推荐

数值计算方法 matlab用二分法或简单迭代法求_快速求解方程的根——二分法与牛顿迭代法

今天是周四高等数学专题的第7篇文章。之前的文章和大家聊了许多数学上的理论,今天和大家聊点有用的东西。我们都知道,工业上的很多问题经过抽象和建模之后,本质还是数学问题。而说到数学问题就离不开方程,在数学上我们可以用各种推算、公式,但是有没有想过在计算机领域我们如何解一个比较复杂的方程?如果之前没有想过,那你可能得想一想,因为以后很有可能会在面试题当中遇到。二分法我们要介绍的第一个方法是二分法。说到二...

weixin_39945915的博客 1305

Java迭代器介绍和遍历时的注意事项

Java中的单列集合分为有序的List系列集合和无序的Set系列集合, 对于List集合普通的for循环即可遍历, 但是Set集合无法使用这种方法, 因此Java提供了一种工具类 — Java迭代器, 用于普遍遍历这两种有序和无序的集合Java迭代器是一种常用且有效的设计模式,它可以帮助我们简化和统一单列集合(包括List系列和Set系列)的遍历,而Java迭代器遍历时不能使用集合方法增删的原因是为了保证迭代器的一致性和正确性。

m0_64015460的博客 1414

工业界实战:小红书推荐系统中的AB测试策略解析——分层、Holdout与反转实验

本文深入解析了小红书推荐系统在工业界实践中采用的AB测试核心策略。重点阐述了分层实验如何解决多实验并行与干扰问题,Holdout机制如何作为评估黄金标准提供稳定基准,以及反转实验如何作为全量上线后的终极安全网进行风险控制。这些策略共同构成了科学、严谨的线上评估体系,是保障推荐系统迭代效果与决策质量的关键。

transformer2023的博客 479

java迭代器详解

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

eyexin2018的博客 817

合宙ESP32C3实战:MPU6500六轴传感器数据读取与校准全解析

本文详细解析了如何使用合宙ESP32C3开发板读取和校准MPU6500六轴姿态传感器数据。从硬件接线、开发环境搭建到核心代码解析,提供了全面的实战指南,帮助开发者快速掌握传感器配置与数据处理技巧,适用于姿态控制、运动检测等应用场景。

weixin_27066963的博客 407

Python金融数据获取工具库之baostock使用详解

在金融数据分析和量化交易中,获取准确及时的市场数据是非常重要的。baostock是一个专门为中国股市数据提供支持的 Python 库,它提供了免费的股票数据接口,用户可以方便地获取股票、指数、基金等各种金融数据。本文将详细介绍baostock库,包括其安装方法、主要特性、基本和高级功能,以及实际应用场景,帮助全面了解并掌握该库的使用。

Rocky006的博客 5348

java: Iterator的使用

本文以ListIterator为例,其他的Iterator使用基本相同。 一、获取ListIterator ListIterator<Integer>itr = sums.listIterator(); LinkedList<Integer> nums = new LinkedList<Integer>(); for(int i = 0; i < 10; ++i) nums.add(i); ListIterator&l

max的博客 1005

ABAP CDS Time Functions 全面解析:用 TIMS_IS_VALID 护航时刻字段的正确性

摘要:本文深入解析ABAP CDS时间函数TIMS_IS_VALID的应用,重点介绍其在企业系统时间字段校验中的关键作用。文章指出无效时间数据会导致业务流程混乱,而CDS层校验能有效减少重复逻辑。详细说明TIMS类型格式要求、空值处理规则,并提供两种工程实现方案:在CDS视图中直接派生校验列,或通过ABAP SQL在内存表中批量验证。最后给出可直接运行的代码示例,包括一个ABAP报表演示内存表验证,以及一个CDS View Entity实现系统时间自动映射与校验,帮助开发者在业务场景中快速落地时间校验功能。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 194

Java Iterator迭代器的使用

迭代器 it 的三个基本操作是 next 、hasNext 和 remove。 调用 it.next() 会返回迭代器的下一个元素,并且更新迭代器的状态。 调用 it.hasNext() 用于检测集合中是否还有元素。 调用 it.remove() 将迭代器返回的元素删除。 Iterator不是一个集合,它是一种用于访问集合的方法 可用于迭代ArrayList和HashSet等集合。 import java.util.Iterator; // 导包 利用迭代器输出集合中第一个元素 ...

weixin_53089473的博客 509

GitHub霸榜神器!NextChat领衔DeepSeek全栈开发范式

NextChat(原ChatGPT-Next-Web)是GitHub上斩获81.2K星标的现象级开源项目,定位为"轻量级AI助手终端",支持DeepSeek、Claude、GPT-4、Gemini等20+主流大模型。• 原生集成DeepSeek、GPT-4、Gemini Pro等模型API,同时兼容RWKV-Runner、LocalAI等自建模型框架,通过环境变量。• 客户端体积仅5MB(Windows安装包约6MB),采用PWA渐进式Web应用技术,首屏加载速度优化至100KB级,老旧设备亦可流畅运行。

实战AI智能体 899

YOLOv11改进有效系列目录 - 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制 - 针对多尺度、小目标、遮挡、恶劣天气等问题

在一些特定情况下,目标检测任务由于多种因素的影响,变得更加复杂和困难。以下是几类常见的困难目标检测场景:1. 小目标检测定义:小目标检测是指当目标在图像中的占比非常小时,模型需要准确识别和定位这些目标。典型场景包括远程监控、卫星图像分析等。挑战1. 低分辨率:由于目标在图像中占据像素较少,细节缺失,特征提取难度增加。2. 特征不足:小目标缺乏明显的形状和纹理特征,容易被复杂背景淹没。3. 检测难度大:由于小目标与背景之间的对比度较低,误检的几率上升。4. 数据不平衡。

qq_64693987的博客 4万+

Java中Iterator(迭代器)的用法及其背后机制的探究

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

weixin_33754913的博客 221

科技与伦理的平衡点:人类计算的伦理

科技与伦理的平衡点:人类计算的伦理 关键词 科技与伦理 人类计算 隐私问题 道德决策自动化 公平性与偏见 法律与社会责任 摘要 本

AI天才研究院 1164

深入理解Java迭代器Iterator

迭代器一、Iterator二、源码剖析Iterator三、迭代器API四、特殊迭代器五、增强for循环、foreach 一、Iterator 概述:由Java容器继承体系结构图可知,Iterator是一个接口,它是迭代器的基本接口。但在Collection接口中继承的是Iterable接口。 二、源码剖析Iterator 1、Iterator是迭代器的基本接口,而在Collection接口中继承的是Iterable接口,不过Iterable中有iterator()这个方法,返回的是Iterator。说明It

weixin_44987871的博客 750

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

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

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java深入理解 - 迭代器 Iterator 总结

今天一朋友在用迭代器时很郁闷为什么会会报Java.util.ConcurrentModificationExceptiond  这个错误, 于是写下这篇博客,想详细的讲讲Java里面  的迭代器.            Iterator简单的来说就是遍历, 遍历什么? 我们常用在遍历集合元素等.             Iterator接口共有四个方法:          public i

zh_coder 1126

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

深入理解Java集合之迭代器Iterator

开篇 相信大家在平时的Java开发中,对集合的遍历操作使用地相当频繁。比如,对ArrayList去重操作、在LinkedList中查询是否包含某个元素。都会涉及到对这个集合中元素的遍历,要么取出元素进行判断,要么进行删除,要么进行修改等等,那么这种取出并操作元素的动作用迭代器Iterator就再适合不过了。 用法 直接一上来就是用,先举个ArrayList去重的例子。代码示例一: im...

Jessehuang Blog 998

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

通过ArrayList源码深入理解java中Iterator迭代器的实现原理

注意:本文将着重从源码的角度对Iterator的实现进行讲解,不讨论List与Iterator接口的具体使用方法。不过看懂源码后,使用也就不是什么问题了。 java中各种实现Iterator的类所具体使用的实现方法各不相同,但是都大同小异。因此本文将只通过ArrayList类源码进行分析。所以最好对ArrayList的源码有一定了解,或者至少具备相关的算法知识。 首先贴出ArrayList类中...

nayi_224的博客 2742

【Java基础】集合遍历:深入理解迭代器(Iterator)与增强for循环

本文介绍了Java集合遍历的两种核心方式:迭代器和增强for循环。迭代器通过Iterator接口实现,初始时指向集合第一个元素前的位置,通过hasNext()和next()方法遍历。增强for循环是迭代器的语法糖,底层仍使用迭代器实现,但代码更简洁。关键区别在于:增强for适合只读遍历,而迭代器支持在遍历中安全删除元素(使用remove()方法)。理解迭代器的"指针"机制(初始位置、移动和取值过程)是掌握集合遍历的关键。

Mulerss的博客 397

Iterator迭代器,不可蜻蜓点水

&lt;style&gt;&lt;/style&gt; 对于java基础了解多少呢?对于Iterator迭代器,掌握多少嗯?是否真正会用了呢? 在做项目中,需求如下:后台传过来list对象,界面显示需要删除list的某一个对象。 解决办法如下: 第一种:其实后台直接传过来已经删除某个对象的list即可,在dao层的sql语句完成。界面直接循环list显示即可。 第二种:后台传过来完...

duoerbasilu 80

Collection集合迭代器iterator遍历集合元素的过程及源码分析

迭代器是遍历Collection集合的通用方式,任意Collection集合都可以使用迭代器进行遍历,那么每一种集合的自身特性是不同的,也就是存储元素的方式不同,那么是如何做到遍历方式的统一呢,接下来我们分析一下迭代器的源代码。 Collection接口中有一个抽象方法 Iterator<E> iterator(),返回对集合中元素进行迭代(遍历)的迭代器。 java.util.Iterator接口 public interface Iterator<E> { boolean

sun10367的博客 685

Java集合源码(Iterator)-笔记

迭代器java.util.Iterator 几个总要参数 int cursor;// 迭代过程中,下一个元素的位置,默认从 0 开始。 int lastRet = -1; // 新增场景:表示上一次迭代过程中,索引的位置;删除场景:为 -1。 int expectedModCount = modCount;// expectedModCount 表示迭代过程中,期望的版本号;modCount 表示...

qq_42451640的博客 147

Iterator

Iterator 接口的几个方法的学习

young-youth的博客 869

28-Iterator接口(迭代器)注意上一节是collection接口创建对象要注意

1.Iterator接口介绍 集合有很多种但是取出方式不一样 例如衣柜取衣服 药瓶拿药 水杯接水 所以出来了迭代器来 迭代概念:即Collection集合元素的通用获取方式。在取元素之前要判断集合中有没有元素,如果有就把这个元素取出来,继续判断,如果还有就再取出来。一直把集合中所有的元素全部取出,这种取出的方式称为迭代。 Java.util.Iterator接口:迭代器(对集合进行遍历) 两个常用方法: boolean hasNext() 如果仍有元素可以迭代,则..

shwjakak的博客 230

"黑马程序员"基础测试:创建ArrayList对象,添加五个元素,使用Iterator遍历输出

今天的任务是把,不会做的某一个题目做出来,然后贴上。 明显的感觉时间不够用了,平时还要工作, 基础测试,有三个题目不会做,这是在看了第十天视频后,开始做的,借助了百度。但还是有3个题目没办法运行就直接提交了 其中就有:“创建ArrayList对象,添加五个元素,使用Iterator遍历输出”这道题目,看到了百度上的答案,但还是没有做出来 没有真的理解。 ArrayList是动态

longshao365的专栏 3588

2024年150道高频Java面试题(二十四)

47. 迭代器 Iterator 是什么?怎么使用?有什么特点?48. Iterator 和 ListIterator 有什么区别?

黑马非马的博客 554

Java大厂面试100题,你面试时总会用到的!

Java是近10年来计算机软件发展的一个传奇,它在众多开发者心中的地位可谓是“爱不释手”,不同于其他一些计算机语言随时间流逝而影响力减弱,Java却随着时间的流逝而越来越强大。 什么是迭代迭代? 迭代是一种设计模式,它是一个能够遍历和选择序列中的对象的对象,而开发者不需要知道序列的基本结构。迭代经常被称为“轻量级”对象,因为其创建成本很低。 如何使用Iterator?特征是什么? JAVA中的Iterator功能相当简单,而且只能单向移动: (1)使用方法iterator()要求容器返回Iterator。当

kaikeba的博客 79
上一篇: Hadoop Demo 1 ——WordCount 统计文章中单词的个数
下一篇: 深入理解Java的序列化和反序列化机制——Serializable
骆驼银子
博客等级 码龄17年 5粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值