数据结构(Java):迭代器遍历【底层源码解析】

1、引言

我们知道,对于List系列集合,添加的元素是有序、可重复、有索引的;而对于Set系列集合,添加的元素是无序、不重复、无索引的。

那么使用for循环通过下标来对Set系列集合进行遍历,那显然是不行的。

迭代器就可以解决这个问题。

因为迭代器迭代器不依赖索引,故既能对有索引集合进行遍历,又能对无索引集合进行遍历。

迭代器也是集合专用的遍历方式。

2、迭代器遍历

迭代器遍历的原理就是:从下标0的位置开始,一个元素一个元素的向后遍历,直到遍历结束。

注意:迭代器不依赖索引

代码如下:

public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("aaa");list.add("bbb");list.add("ccc");//获取迭代器对象Iterator<String> it = list.iterator();while (it.hasNext()) {//判断当前位置是否有元素String str = it.next();//1.获取当前位置 2.将迭代器指针指向下一个元素System.out.println(str);}}

我先对其中的方法做一下简单说明。

2.1 获取迭代器对象

使用迭代器进行遍历,我们首先需要获取迭代器对象,而我们可以调用ArrayList中的iterator方法来获取迭代器对象。

我们通过源码可以发现,返回值为Iterator<E>,我们使用Iterator<E>接收即可。

2.2 迭代器的方法

2.2.1 hasNext方法

该方法就是判断,当前迭代器对象指向的位置上是否有元素,若有元素,则返回true,若没有元素,则返回false。

2.2.2 next方法

该方法有两个步骤:

1.获取当前位置上的元素

2.迭代器指针往后移动,指向下一个元素


到目前为止,想要使用迭代器来进行遍历,以上的三种方法是我们必须要掌握的:

1.iterator方法:获取迭代器对象

2.hasNext方法:判断当前位置是否有元素

3.Next方法:获取当前位置元素并且迭代器指针向后移动


2.3 迭代器的四个细节

2.3.1 细节点1

如果当前位置没有元素,还使用next方法进行获取,会抛出NoSuchElementException异常

2.3.2 细节点2

迭代器遍历完毕,指针不会复位

2.3.3 细节点3

循环中只能用一次next方法

因为每使用一次next方法,指针就会向后移动一次;若循环中有两个next方法,而元素个数为奇数个时,则会一次循环指针移动两次,最后一次循环时,会有一个next获取元素时当前位置没有元素,会抛出NoSuchElementException异常。

2.3.4 细节点4

迭代器遍历时,不能使用集合的方法进行增加或删除元素

例如:

若在迭代器遍历时使用了集合的增加或者删除方法,会抛出ConcurrentModificationException(并发修改异常)

至于为什么不能使用集合的方法来修改元素,我将在下面的源码分析中解释。

所以,如果想要在迭代器遍历时修改元素,我们使用迭代器的相关方法即可:

代码:

public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("aaa");list.add("bbb");list.add("ccc");Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {String str = iterator.next();if ("aaa".equals(str)) {//迭代器遍历时,删除元素,只能使用迭代器的remove方法iterator.remove();}}System.out.println(list);}

如果要删除元素,使用迭代器的remove方法;

如果要添加元素,暂时还没有方法。


OK,迭代器遍历的大致内容已经阐述完毕,接下来是迭代器源码的深度解析


2.4 迭代器遍历 源码深度解析

我已经将底层源码分析整理在这张图上,清晰明了:

OK~本次博客到这里就结束了,

感谢大家的阅读~欢迎大家在评论区交流问题~

如果博客出现错误可以提在评论区~

创作不易,请大家多多支持~

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

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

相关文章

Spring的AOP概念详解

AOP详解&#xff1a; 1.介绍&#xff1a; 面向切面编程&#xff0c;是一种将非业务代码与业务代码进行分离的一种思想&#xff0c;在实际开发中,往往有许多重复操作,例如事务提交,权限验证,保存口志等功能需要在业务代码重复调用&#xff0c;面向切面编程,就是将非业务代码进…

51单片机-让一个LED灯闪烁、流水灯(涉及:自定义单片机的延迟时间)

目录 设置单片机的延迟&#xff08;睡眠&#xff09;函数查看单片机的时钟频率设置系统频率、定时长度、指令集 完整代码生成HEX文件下载HEX文件到单片机流水灯代码 (自定义延迟时间) 设置单片机的延迟&#xff08;睡眠&#xff09;函数 查看单片机的时钟频率 检测前单片机必…

算法:递归数组求和

递归数组求和 给定一个数组&#xff0c;求所有元素的和 算法思想&#xff1a; 传入数组和下标&#xff0c;如果下标越界就返回0&#xff0c;否则返回当前值和下一个值的和&#xff0c;递归操作。 Java实现&#xff1a; public class Main {public static int func(int[] a…

数据结构第09节:二叉树

树是一种非线性的数据结构&#xff0c;它由节点和边组成。每个节点可以有零个或多个子节点。在树中&#xff0c;没有循环&#xff0c;并且所有的节点都是通过边连接的。 树的基本概念&#xff1a; 根节点&#xff1a;没有父节点的唯一节点。子节点&#xff1a;一个节点可以直接…

JVM的五大内存区域

JVM的五大内存区域 JVM内存区域最粗略的划分可以分为 堆 和 栈 &#xff0c;当然&#xff0c;按照虚拟机规范&#xff0c;可以划分为以下几个区域&#xff1a; JVM内存分为线程独享区和线程共享区&#xff0c; 其中 方法区 和 堆 是线程共享区&#xff0c; 虚拟机栈, 本地方法…

[知识点]-[宽搜bfs]

离开中山路 #include<bits/stdc.h> #define fi first #define se second #define pb push_back #define PII pair<int,int > #define int long long #define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);using namespace std;const int N 1e6…

延边幼儿园1*3 OLED柔性屏翻页一体机安装项目

一、产品介绍 本次项目在吉林省延吉市延边幼儿园内&#xff0c;引入了先进的55寸1*3 OLED柔性屏翻页一体机。该设备集高清显示、灵活翻页、互动教学等功能于一体&#xff0c;专为现代幼儿教育环境设计&#xff0c;旨在通过科技手段提升教学质量&#xff0c;丰富教学手段&#x…

数据库重命名脚本

由于原本的数据库命名不规范&#xff0c;需要进行重新命名&#xff0c;最终确定方案为新建数据库后迁移表&#xff0c;以下为脚本。 #!/bin/bashecho -e "\033[34m 此脚本功能为修改数据库名称&#xff08;需要新建数据库后将数据迁移到新数据库&#xff09;&#xff0c;…

rtsp client c++

直接上代码&#xff1a;源码 void doRtspParse(char *b) {std::vector<std::string> res;char *ptr b, *ptr1 nullptr;while ((ptr1 strstr(ptr, "\r\n"))) {res.push_back(std::string(ptr, ptr1 - ptr));ptr ptr1 2;}int len ptr - b;b[len - 1] \0;…

1.1.2数据结构的三要素

一.数据结构的三要素 数据结构这门课着重关注的是数据元素之间的关系&#xff0c;和对这些数据元素的操作&#xff0c;而不关心具体的数据项内容 。 1.逻辑结构 &#xff08;1&#xff09;集合结构 &#xff08;2&#xff09;线性结构 数据元素之间是一对一的关系。除了第一个…

如何选择鼠标和键盘@无线外设鼠标键盘连接方案对比

文章目录 鼠标续航问题充电接口鼠标模式数低功耗蓝牙总结 键盘首要因素&#x1f47a;下面是详细对比 鼠标 关于蓝牙鼠标、2.4GHz无线鼠标和有线鼠标的详细对比表格&#xff0c;特别关注消费者相关的特性&#xff1a; 特性蓝牙鼠标2.4GHz无线鼠标有线鼠标连接方式蓝牙2.4GHz无…

MongoDB-社区版-本地安装

系统&#xff1a;win10 1. 下载server:Download MongoDB Community Server | MongoDB 我选的zip包 2. 下载shell&#xff1a;MongoDB Shell Download | MongoDB 我选的zip包 3. 启动server 4. 启动shell, 完成

这样拼板帮你省近万元,堪称PCB工程师成本终结者!

别再被骗了&#xff0c;打PCB板价格高不是单价高&#xff01;而是你的拼板导致利用率太低了&#xff01; 今天给大家讲个小故事&#xff0c;教大家如何省钱...... 一个爽朗的晴天&#xff0c;我听闻同事说有客户对他吐槽打板子价格太高&#xff0c;说着说着就开始吹起了牛逼...…

Spring MVC的核心类和注解——@RequestMapping注解(三)请求映射方式

一、请求映射方式的分类 基于注解风格的Spring MVC&#xff0c;通过RequestMapping注解指定请求映射的URL路径。URL路径映射常用的方式有基于请求方式的URL路径映射、基于Ant风格的URL路径映射和基于REST风格的URL路径映射。接下来分别对这三种请求映射方式进行详细讲解。 a. …

受风头痛的几种情况

受风是指人体外感风邪引起的疾病&#xff0c;不同的病因需要采用相应的治疗方法进行调理和治疗。风为六淫之一&#xff0c;具有轻扬开泄的特性&#xff0c;易伤人肌表&#xff0c;引起头痛等症状。 中医认为头疼受风是由于外感引起的&#xff0c;头疼可以分为外感和内伤两个原…

【TB作品】体重监控系统,ATMEGA16单片机,Proteus仿真

机电荷2018级课程设计题目及要求 题1:电子称重器设计 功能要求: 1)开机显示时间(小时、分)、时分可修改; 2)用滑动变阻器模拟称重传感器(测量范围0- 200g),数码管显示当前重量值,当重量值高于高 值时,红灯长亮; 3)当重量值低于低值时,黄灯长亮; 4)当重量值在正常值时,绿灯亮; 5…

代码随想录打卡第十五天

代码随想录–二叉树部分 day15 二叉树第三天 文章目录 代码随想录--二叉树部分一、力扣110--平衡二叉树二、力扣257--二叉树的所有路径三、力扣404--左叶子之和四、力扣222--完全二叉树的节点个数 一、力扣110–平衡二叉树 代码随想录题目链接&#xff1a;代码随想录 给定一个…

关于DB_CREATE_FILE_DEST初始化参数

DB_CREATE_FILE_DEST指定了OMF的默认位置。 OMF指 Oracle Managed Files&#xff0c;OMF指定一个文件系统中的目录&#xff0c;数据库会在此目录中自动创建、命名和管理数据库对象级别的文件。 OMF用的较多的是数据文件。 来看一个例子。已有一个PDB&#xff1a;orclpdb1&am…

springboot学生档案信息管理系统-计算机毕业设计源码96509

目 录 第 1 章 引 言 1.1 选题背景 1.2 研究现状 1.3 论文结构安排 第 2 章 系统的需求分析 2.1 系统可行性分析 2.1.1 技术方面可行性分析 2.1.2 经济方面可行性分析 2.1.3 法律方面可行性分析 2.1.4 操作方面可行性分析 2.2 系统功能需求分析 2.3 系统性需求分析…

GBase 8c V5 主备式部署手册

GBase 8c V5 主备式部署实操 一、前言二、环境准备三、安装四、数据库启停五、卸载六、连接和 SQL 测试 一、前言 GBase 8c 是 GBASE公司&#xff08;天津南大通用数据技术股份有限公司&#xff09;自主研发的一款多模多态的企业级分布式数据库&#xff1a;支持行存、列存、内存…