重学java 47.集合 ② 迭代器

金榜题名,前程似锦

                          —— 24.5.27

一、迭代器的介绍和使用

1.概述

        Iterator接口

2.主要作用

        遍历集合

3.获取

        Collection中的方法:

                Iterator<E> iterator()

4.方法

        boolean hasNext() —> 判断集合中有没有下一个元素

        E.next() —> 获取下一个元素

5.示例

import java.util.ArrayList;
import java.util.Iterator;public class Demo224Iterator {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("慕容云海");list.add("楚雨寻");list.add("端木磊");list.add("上官瑞谦");list.add("叶烁");// 获取迭代器对象Iterator<String> iterator = list.iterator();// 判断有没有下一次迭代while (iterator.hasNext()){String element = iterator.next();System.out.println(element);}}
}

注意:next方法在使用时,不要连续多次使用,否则会出现:NoSuchElementException:没有可操作的元素异常

二、迭代器迭代过程

int cursor;        // 下一个元素索引位置

int lastRet = -1;        // 上一个元素索引位置

三、迭代器底层原理

1.获取Iterator的时候如何获取:

        Iterator iterator = list.iterator()

        Iterator是一个接口,等号的右边是它的实现类对象

2.Iterator接收的是哪个实现类对象?

        ArrayList中的内部类Itr对象(各集合的内部类对象不一样)

注意:只有ArrayList使用迭代器的时候Iterator接口才会指向Itr,其他的集合使用迭代器,Iterator就指向的不是Itr

package S83SetFrame;import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;public class Demo224Iterator {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("慕容云海");list.add("楚雨荨");list.add("端木磊");list.add("上官瑞谦");list.add("叶烁");// 获取迭代器对象Iterator<String> iterator = list.iterator();// 判断有没有下一次while (iterator.hasNext()){String element = iterator.next();System.out.println(element);}HashSet<String> set = new HashSet<>();Iterator<String> iterator1 = set.iterator();}
}

四、并发修改异常(了解)

需求:

        定义一个集合,存储 唐僧,孙悟空,猪八戒,沙僧,遍历集合,如果遍历到猪八戒,往集合中添加一个白龙马

package S83SetFrame;import java.util.ArrayList;
import java.util.Iterator;public class DemoSetFramePractice {public static void main(String[] args) {// 需求:定义一个集合,存储 唐僧,孙悟空,猪八戒,沙僧,遍历集合,如果遍历到猪八戒,往集合中添加一个白龙马ArrayList<String> list = new ArrayList<>();list.add("唐僧");list.add("孙悟空");list.add("猪八戒");list.add("沙僧");// 遍历集合Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {String next = iterator.next();// 字符串比较,常量放在前,用equals函数比较if("猪八戒".equals(next)){list.add("白龙马");}}System.out.println(list);}
}

结论:当预期操作次数和实际操作次数不相等了,会出现"并发修改异常”

最终结论:我们调用了add方法,而add方法底层只给modcount++,但是再次调用next方法的时候,并没有给修改后的modcount重新赋值给expectedModcount,导致next方法底层的判断判断出实际操作次数和预期操作次数不相等了,所以抛出了"并发修改异常"

package S83SetFrame;import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;public class DemoSetFramePractice {public static void main(String[] args) {// 需求:定义一个集合,存储 唐僧,孙悟空,猪八戒,沙僧,遍历集合,如果遍历到猪八戒,往集合中添加一个白龙马ArrayList<String> list = new ArrayList<>();list.add("唐僧");list.add("孙悟空");list.add("猪八戒");list.add("沙僧");// 遍历集合ListIterator<String> listIterator = list.listIterator();while (listIterator.hasNext()) {String next = listIterator.next();// 字符串比较,常量放在前,用equals函数比较if("猪八戒".equals(next)){listIterator.add("白龙马");}}System.out.println(list);}
}

使用迭代器迭代集合的过程中,不要随意修改集合长度,容易出现并发修改异常

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/842428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《QT实用小工具·六十六》基于QT开发的界面收缩栏

1、概述 源码放在文章末尾 该项目实现了一个界面收缩栏的效果&#xff0c;该收缩栏包含如下功能&#xff1a; 1、可以在收缩栏中添加若干个界面 2、鼠标点击收缩栏可以展开或收起界面 3、鼠标拖动收缩栏可以和其他界面互换位置 项目demo演示如下所示&#xff1a; 使用方式&…

iptables 规则参数

本文只是记录常用的命令行规则&#xff0c;如果想了解和学习 iptables&#xff0c;请移步《IPtables》 每一条匹配规则都可以使用 ! 进行取反。如 ! --dport 22 表示所有目标端口不为 22 的请求 下表为链和表的对应关系 ChainTablePREROUTINGraw表&#xff0c;mangle表&…

小甲零基础入门学习Python(全96集)

介绍 本课程旨在为学者提供关于Python 3.x版本的基础教学&#xff0c;确保学员能够熟练掌握其语法结构。通过整合讲师的实际工作经验&#xff0c;课程内容不仅覆盖了Python的应用技巧&#xff0c;还深入讨论了相关的数据结构知识。为了增强学习效果&#xff0c;我们精心准备了…

Unable to find a node that satisfies the following conditions [port xxxx]

Unable to find a node that satisfies the following conditions [port xxxx] 原因&#xff1a;当容器使用端口映射(docker run -p xxxx:xxxx或 compose模板中的 ports)之后 系统会在宿主机上创建一个port&#xff0c;通过NAT来访问容器的指定port。如果宿主机上的端口被容器或…

版本控制(Version Control)(GIT )

版本控制系统的基本概念 版本库&#xff08;Repository&#xff09;&#xff1a;存储项目版本的本地或远程存储库。工作副本&#xff08;Working Copy&#xff09;&#xff1a;可编辑的项目本地副本。文件&#xff08;File&#xff09;&#xff1a;项目中的单个文件。版本&…

jenkins 用户权限(Manage-Roles)

本次需求将DEV环境和SIT环境分开,SIT用户登录上来只能看他的SIT项目和视图 安装roles插件 进入 manage role 项目授权 用户 正则匹配你需要的项目 dev .*-dev*或者.*-dev$ sit .*-sit最后细分assign role 测试使用sit账号登录 ,视图和项目都是SIT账号的

爬虫视图展示之 Power BI

实现方式 读取数据的实现 selenium 库 requests 库 存储媒介 MysqlElasticSearch 图表展示 GrafanaPower BI 是什么&#xff1f; Power BI 简单且快速&#xff0c;能够从 Excel 电子表格或本地数据库创建快速见解。 同时 Power BI 也可进行丰富的建模和实时分析&#xff…

移动云:开发者手中的未来钥匙

《移动云&#xff1a;开发者手中的未来钥匙》 引言一、无缝集成&#xff0c;加速开发进程二、数据智能&#xff0c;洞悉用户心声三、安全合规&#xff0c;护航创新之旅四、成本优化&#xff0c;助力轻装前行总结 引言 在科技日新月异的今天&#xff0c;移动云已成为推动行业变革…

kube-apiserver内存占用过多 go tool pprof 入门

目录 环境问题排查1、kube-apiserver %CPU 146 正常&#xff0c;%MEM 高达70&#xff0c;&#xff0c;load average 400&#xff0c;出现kswapd0进程。2、k describe node 看到 SystemOOM3、是否大量连接导致&#xff1f;4、通过prom查看指标5、访问K8s API6、pprof 火焰图 解决…

云服务器购买之后到部署项目的流程

1.通过账号密码登录百度智能云控制台; 2.进入对应的服务器‘云服务器BBC’ 找到’实例‘即找到对应的服务器列表; 此时通过本地电脑 1.cmd命令提示符 PING 服务器公网地址不通&#xff1b; 2.通过本地电脑进行远程桌面连接不通 原因&#xff1a;没有关联安全组&#xff0c;或者…

持续总结中!2024年面试必问 20 道 Redis面试题(十)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 20 道 Redis面试题&#xff08;九&#xff09;-CSDN博客 十九、Pipeline有什么好处&#xff0c;为什么要用pipeline Pipeline&#xff08;管道&#xff09;是 Redis 提供的一种功能&#xff0c;它允许客户端将多…

Linux的nload/nettraf命令实时网卡流量监测

对于linux的网卡上下行流量监测方法有很多 例如nload 现成的nload命令 现成的有 nload 安装 yum -y install nload 查看所有网卡实时网速 sudo nload -m 按enter/上下翻页键即可切换网卡 查看指定网卡实时网速 sudo nload eth0 -m 基于nettraf编译的rpm包 当然也可以你…

MySQL:如果用left join的话,左边的表一定是驱动表吗

一、前言 在日常开发过程中关于MySQL的优化方面&#xff0c;我们知道小表驱动大表原理。例如left join&#xff0c;放在左边的表作为驱动表。但是用left join的话&#xff0c;左边的表一定是驱动表吗&#xff0c;本文将通过案例分析给出详细分析。 二、概念 在MySQL中&#xf…

Android开发 -- JNI开发

1.配置JNI环境 创建JNI文件夹 在项目的主目录中创建一个名为 JNI 的文件夹。这个文件夹将包含所有的本地源代码和配置文件。 编写Android.mk文件 这个文件是一个 Makefile&#xff0c;用来指导 NDK 如何编译和构建本地代码。 #清除之前定义的变量&#xff0c;确保每个模块的…

安装HAP时提示“code:9568344 error: install parse profile prop check error”错误

问题现象 在启动调试或运行应用/服务时&#xff0c;安装HAP出现错误&#xff0c;提示“error: install parse profile prop check error”错误信息。 解决措施 该问题可能是由于应用使用了应用特权&#xff0c;但应用的签名文件发生变化后未将新的签名指纹重新配置到设备的特…

[Java EE] 网络编程与通信原理(三):网络编程Socket套接字(TCP协议)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

BookStack VS HelpLook两款知识库软件的区别

现在很多企业都会进行知识管理&#xff0c;在这个过程中&#xff0c;选择一个合适的知识库软件是一个不可避免的问题。在众多知识库软件中&#xff0c;HelpLook和BookStack这两款软件备受企业瞩目。不知如何选择&#xff0c;今天LookLook同学就简单介绍一下这两款知识库的区别&…

5.27作业

定义自己的命名空间my_sapce&#xff0c;在my_sapce中定义string类型的变量s1&#xff0c;再定义一个函数完成对字符串的逆置。 #include <iostream>using namespace std; namespace my_space {string s1;string reverse1(string s1);} using namespace my_space; int m…

工作经验总结:C语言中类函数的宏定义、宏定义拼接、常量指针与指针常量的识别记忆技巧整理

一、类函数的宏定义 初步接触AUTOSARS架构代码时&#xff0c;发现其中用了很多类函数的宏定义以及宏定义拼接等一些技巧来进行模块化&#xff0c;如果对C语言掌握不够熟练则可能会觉得比较难看懂&#xff0c;下面简单介绍一下几种见到的类函数宏定义使用方式。 大致的类函数的…

深入解读 ChatGPT 的基本原理(个人总结版)

引言 背景 人工智能&#xff08;AI&#xff09;技术自20世纪中期诞生以来&#xff0c;经历了多次革新和进步。从最早的图灵测试&#xff0c;到20世纪末的深蓝计算机击败国际象棋冠军&#xff0c;再到21世纪初谷歌AlphaGo击败围棋冠军&#xff0c;AI技术的飞速发展改变了人们的…