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

红外通信不止遥控器:手把手教你用2ASK调制实现语音+温度数据同传 本文详细介绍了如何利用2ASK调制技术实现红外通信系统,同时传输语音和温度数据。通过STM32F103C8T6微控制器和DS18B20温度传感器的硬件设计,结合2ASK调制原理,展示了系统的完整实现方案。文章还提供了调试优化建议,适合电子爱好者和通信工程学生实践学习。 阅读详情

今天一位朋友在用迭代器时很郁闷为什么会会报Java.util.ConcurrentModificationExceptiond 异常, 于是写下这篇博客,想详细的讲讲Java里面  的迭代器.

           Iterator简单的来说就是遍历, 遍历什么? 遍历集合元素等.  

          Iterator接口共有四个方法:         

public interface Iterator<E>{

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


 如果只是普通的迭代输出,那么不会出现什么问题.但是在现实需求中这往往没有什么用,我们还需要做一些额外的操作,比如说

 add/remove等。 但是这样做很可能会出现一些很尴尬的事情, 下面我给出一段正确的迭代删除代码:

import java.util.*;

public class TestIterator
{
    public static void main(String[] args)
    {
        // 创建集合、添加元素
        Collection<String> books = new ArrayList();
        books.add("测试1");
        books.add("测试2");
        books.add("测试3");
   
        Iterator it = books.iterator();
        while(it.hasNext())
        {
            // it.next()方法返回的数据类型是Object类型,因此需要强制类型转换
            String book = (String)it.next();
            System.out.println(book);
            if (book.equals("测试2"))
            {
                // 从集合中删除上一次next方法返回的元素
                it.remove();
            }

        }
        System.out.println(books);
    }
}

上面的代码经过测试是可以正确删除元素的,有疑问的代码估计也就是这一句了
  Iterator it = books.iterator();

这段代码的意思是  获得List对象的迭代器, 然后通过迭代器来遍历List对象内保存的元素.

接着我们就可以调用他的 hasNext方法和next方法去操作他了.


接着贴出一段错误的代码这是在我工作机上面测试的代码 jdk是1.8 (当然我相信以前的jdk结果应该也是这样):
 
 
那么为什么二种删除方式一个有错一个没错呢(这个问题难倒了工作三年的一个朋友).  经过刚刚的测试,我们发现用迭代器本身删除是可以的,但是在迭代器中

对list本身进行删除就不行了, 对于这种莫名其妙的问题,我们从源码入手, 首先根据上面的我们先看看ArrayList他是怎么返回Iterator实例的,最终源码如下:



 在ArrayList类中有一个私有类Private Itr 我们注意到expectedModCount这个字段,他的初始值是等于modCount的。 那modCount又是干啥的呢 最直接的。 看源码:

 

我们从源码可以对集合的每一次 add / remove 都会触发一下这个字段,而上面Itr的remove 不管在删除还是添加都会触发一个方法(csdn上截图太麻烦我直接写了 )   checkForComodification();这个方法, 大家可以看看上面的截图而这个 checkForComodification();方法中只有一个功能

 if (modCount != expectedModCount)
                throw new ConcurrentModificationException();

 那就是抛出异常~~~~

所以大家应该懂了那段错误的代码为什么会错误了吧。。 因为二个字段不相等啊。 没有同步啊。


如果你问我为什么要这么做,我只能这么跟你说:

Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性

   

 

   


  

把 ABAP ALE Change Pointers 讲透:从 CDHDR/CDPOS 到 BDCP2,再到 RBDMIDOC 的自动分发链路 摘要:SAP ALE Change Pointers机制在系统集成中实现业务变更与数据分发的解耦。它记录业务对象变更(如SAP主数据修改),但不立即发送,而是由后续分发逻辑决定发送时机和方式。该机制包含两层:Change Documents记录审计级变更明细,Change Pointers标记需分发的关键变更。配置核心包括全局开关、消息类型激活和字段选择。典型应用如零售价格条件变更自动推送至POS系统,通过BDCP2表存储待处理队列,由RBDMIDOC程序定时评估生成IDoc。运维需关注定期清理和性能优化, 阅读详情

相关推荐

EEVDF调度算法核心实现解析(一)

本文深入解析Linux kernel 6.6引入的EEVDF调度算法核心实现,详细讲解其基于虚拟截止时间(virtual deadline)的进程挑选机制和红黑树优化设计。通过代码实例展示算法如何平衡系统响应速度与公平性,特别适合需要优化Linux系统性能的开发者参考。

weixin_42522953的博客 478

Iterator遍历集合时不可以删除集合中的元素问题

Iterator是工作在一个独立的线程中,拥有一个mutex锁。Iterator被创建后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针向后面移动的时候就找不到要迭代的对象,按照fail-fast原则,Iterator会马上抛出 java.util.ConcurrentModificationException异常。所以,在Iterato...

try to do 1755

避坑指南:解决‘Logical volume contains a filesystem in use’错误,顺利完成LVM根目录扩容

本文详细解析了Linux系统中LVM根目录扩容时遇到的‘Logical volume contains a filesystem in use’错误,提供了从错误诊断到实战解决方案的完整指南。通过动态扩容技术、单用户模式操作和LVM快照等方案,帮助管理员顺利完成根目录扩容,避免数据丢失和系统崩溃。

weixin_28702105的博客 228

迭代器的实现原理

迭代器的实现原理简述

LX_1234567的博客 1139

构建多节点AI代理网络:OpenClaw协同框架与实战部署指南

在分布式系统与AI代理技术领域,多节点协同是提升智能体能力与扩展性的核心挑战。其原理在于通过设计清晰的通信协议与数据同步机制,使分散的智能体能够共享状态、知识与技能,从而实现1+1>2的群体智能。这一技术价值在于突破了单点AI的能力上限,为构建复杂、鲁棒且可扩展的自动化系统提供了基础。典型的应用场景包括跨设备任务编排、企业级工作流自动化以及大规模AI代理集群的管理。本文聚焦于OpenClaw这一开源AI代理框架,深入探讨如何利用模块化设计(如网状网络与任务控制中心)实现记忆共享与统一调度,解决多网关协同中的

weixin_42521032的博客 299

从仿真到实机:四足机器人控制算法的全流程验证框架

本文系统阐述了四足机器人从仿真到实机的全流程验证框架。针对仿真与实机环境的巨大差异,文章详细介绍了在MuJoCo等高保真仿真环境中的建模、算法迭代与压力测试方法,并重点解析了通过硬件抽象层和中间件搭建通往实机的关键桥梁。最后,提供了实机部署的安全清单与调试策略,旨在帮助开发者构建可重复、风险可控的算法验证闭环,提升算法在真实世界中的鲁棒性与可靠性。

lilh34434的博客 384

迭代器iterator原理和设计模式

文章参考自:http://www.jb51.net/article/39790.htm、http://blog.youkuaiyun.com/scyatcs/article/details/9003295 一、Iterator的API       关于Iterator主要有三个方法:hasNext()、next()、remove()       hasNext:没有指针下移操作,只是判断

hebixi的专栏 2584

轮式并联五连杆下肢机器人运动控制:从建模到强化学习仿真训练

本文提出了一种基于强化学习的轮式并联五连杆下肢机器人运动控制方法。首先建立了机器人的运动学和动力学模型,推导了正逆解公式,并构建了URDF模型。随后在PyBullet仿真环境中搭建了包含复杂地形的训练场景,设计了基于PPO算法的端到端控制策略,包含状态空间、动作空间和奖励函数的详细设计。通过多组仿真实验验证了该方法在台阶攀爬等任务中的有效性,为轮腿机器人运动控制提供了完整的可复现技术方案。

huanghm88的专栏 350

【C++】STL 容器 - vector 动态数组容器 ⑦ ( 迭代器 iterator 基本原理 | 迭代器 iterator 分类 | 双向迭代器 | 随机访问迭代器|迭代器正向遍历与逆向遍历 )

一、 迭代器 iterator 基本原理 1、迭代器 iterator 作用 2、迭代器 iterator 分类 3、双向迭代器 4、随机访问迭代器 二、 迭代器 iterator 正向遍历与逆向遍历 1、迭代器正向遍历与逆向遍历 2、使用迭代器正向遍历 vector 容器 3、使用迭代器反向遍历 vector 容器

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2808

S7-1200 PLC PID功能 | 调节PID参数

S7-1200 PLC PID功能 | 调节PID参数

Robot_PLC_HMI_Automation 1万+

数据分析之AB测试基础知识

在 A/B 测试中,零假设是两组的指标是相同的,当假设检验推断出两组指标不同,但事实上两组指标相同时,就是第一类错误。

qq_45727498的博客 561

深入理解Java迭代器Iterator

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

weixin_44987871的博客 750

自己的搭建的slam机器人建图导航测试

1、前言 这里是对自己搭建的slam机器人建图导航的功能测试,原本并不想写这一篇的,因为每个小伙伴的需求都不一样,但是发现还是有同学有需求,于是就有了这一篇。本篇属于说明分享类文章,不涉及细节解释。按照步骤操作即可。 本次测试需要建图算法my_slam_gmapping、导航框架navigation、以及explore_lite功能包、mbot_teleop键盘控制功能包等。 环境:ubuntu mate 16.04 + ROS Kinetic 功能包下载:在公众号:小白学移动机器人,发送:建图导航测试,即

「小白学移动机器人」一个专注分享移动机器人相关知识的公众号! 8707

深入理解Java的迭代器Iterator

先看一段代码: 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 li

thinking4java的专栏 1850

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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

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

Jessehuang Blog 998

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

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

nayi_224的博客 2742

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【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

Java Iterator迭代器的使用

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

weixin_53089473的博客 509

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

集合概述、迭代器、泛型

一、Collection集合 1.集合概述 集合:集合是java中提供的一种容器,可以用来存储多个数据。 集合和数组的区别: 数组的长度是固定的。集合的长度是可变的。 数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储 2.集合框架 集合按照其存储结构可以分为两大类,分别是单列集合 java...

finalblue的博客 203
上一篇: Java异常处理
下一篇: 使用jdk1.8去除逻辑上重复的HashMap的value以及构建本地缓
zh_coder
博客等级 码龄12年 31粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值