数据结构(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~本次博客到这里就结束了,

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker k8s

1、docker是什么&#xff1f; 将环境和程序一起打包给到 服务器运行的工具软件。 2、基础镜像base image是什么&#xff1f; 操作系统&#xff1a;用户空间、内核空间 阉割操作系统&#xff0c;利用其的用户空间&#xff08;因为应用程序运行在用户空间&#xff09;&#xf…

转换Python2 转 Python3 小程序

转换Python2 -> Python3 藉由python35\Tools\scripts\2to3.py 档转换 python D:\python\Tools\scripts\2to3.py D:\Users\a0979\Desktop\scrip.pypython [转档程式] [欲转档.py] * python 为 python3 ->因为转档程式为python3 ![](https://i.imgur.com/PeQkvhk.png)py…

STM32的EXTI简介

一&#xff0c;EXTI&#xff08;External Interrupt&#xff09;外部中断事件控制器 什么是EXTI&#xff1f; 1.监测指定的GPIO口的电平信号变化&#xff0c;并检测到指定条件时&#xff0c;向内核的中断控制器NVIC发出中断申请。NVIC在裁决后&#xff0c;如果满足条件&#xf…

工业4.0能给电能表带来什么机会

一、技术革新与升级 工业4.0的核心在于智能化和网络化&#xff0c;这促使电能表行业进行技术革新和升级。传统的电能表功能单一&#xff0c;主要用于测量电能消耗。而在工业4.0的推动下&#xff0c;电能表逐渐发展成为集信息储存和处理、网络通信、实时监测等多种功能于一体的…

云计算【第一阶段(22)】Linux的进程和计划任务管理

目录 一、查看进程 1.1、程序和进程的关系 1.2、查看进程 1.2.1、静态查看进程信息ps ​编辑 1.2.1.1、实验 1.2.2、动态查看进程信息top 1.2.2.1、实验 1.2.2.2、top 命令全屏操作界面快捷键 1.2.3、pgrep根据特定条件查询进程pid信息 1.2.4、pstree命令以树形结构列出…

5、Python之rich:GUI之外,终端呈现也能玩出花

引言 在Python系列文章的上一篇中&#xff0c;我们从print的定义出发&#xff0c;进一步探索了print()函数更多的用法&#xff0c;尤其是一些哪怕是Python老手也可能忽略的用法。没有阅读的或者需要回顾print()及输出格式化的扩展用法&#xff0c;可以查看上一篇文章。 虽然pr…

Git安装与使用及整合IDEA使用的详细教程

1. 版本控制软件介绍 版本控制软件提供完备的版本管理功能&#xff0c;用于存储、追踪目录&#xff08;文件夹&#xff09;和文件的修改历史&#xff0c;是软件开发者的必备工具&#xff0c;是软件公司的基础设施。版本控制软件的最高目标&#xff0c;是支持软件公司的配置管理…

Swift 新结构化并发中鲜为人知的 isolated 参数

概述 伴随着 Swift 5.5&#xff08;WWDC21&#xff09;推出的新结构化并发到今年的 WWDC 24 已经有 3 个多年头了。想必大家都对其中 async/awiat、async let、TaskGroup、Actor 等各种概念都了然于胸了吧&#xff1f; 不过小伙伴们可能不知道的是&#xff1a;新结构化并发&a…

【Eplan】P8-图纸设计的四种方法

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 了解 EPLAN 的图纸设计的四种方法&#xff1a;面向图形、面向设备、面向物料清单、面向安装情况&#xff1b; 2、 问题场景 为什么 EPLAN 要使用四种不同的设计方法。 3、软硬件环境 1、软件版本&#xff1a;EPLAN…

Ubuntu无法安全地用该源进行更新,所以默认禁用该源。

解决方案 1. 获取并添加缺失的 GPG 公钥 可以使用 apt-key 命令来添加缺失的公钥。根据错误信息&#xff0c;缺失的公钥是 3B4FE6ACC0B21F32。 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F322. 更新软件包列表 添加公钥后&#xff0c;更…

ADS131A04硬件设计与软件调试

一、IC基本信息 ADS131A0x 双通道或四通道 24 位 128kSPS 同步采样 Δ-Σ ADC •双通道或四通道同步采样差分输入 • 数据速率&#xff1a;高达 128kSPS • 高性能&#xff1a; – 单通道精度&#xff1a;在 10,000:1 动态范围内优于 0.1% – 有效分辨率&#xff1a;20.6位…

【MotionCap】搭建wsl2的pytorch环境

参考大神:wsl2-ubuntu版本 cuda下周cuda11.3 wget https://developer.download.nvidia.com/compute/cuda/11.3.0/local_installers/cuda_11.3.0_465.19.01_linux.run sudo sh cuda_11.3.0_465.19.01_linux.run cuda是开源的么?下15分钟

重磅!云起无垠荣获“智能模糊测试赛道领航者”等多项殊荣

近日&#xff0c;以 “新质•真能力”&#xff08;新质生产力&#xff0c;安全真能力&#xff09;为主题的第四届数字安全大会正式召开。在此次大会上&#xff0c;数世咨询发布了《中国数字安全产业年度报告(2024)》、新质百强榜单以及国内首本《数字安全蓝皮书》。这些报告和榜…

操作系统精选题(四)(论述题)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;操作系统 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 前言 一、银行家算法的一道例题 二、页…

【NOI】C++程序设计入门四

文章目录 前言一、浮点型&#xff08;float和double&#xff09;1.float类型2.double类型 二、保留小数的方法方法一&#xff1a;方法二&#xff1a; 三、样题讲解问题1&#xff1a;1603. 冷饮的价格&#xff1f;问题2&#xff1a;1957. 求三个数的平均数问题3&#xff1a;1602…

爬数据是什么意思?

爬数据的意思是&#xff1a;通过网络爬虫程序来获取需要的网站上的内容信息&#xff0c;比如文字、视频、图片等数据。网络爬虫&#xff08;网页蜘蛛&#xff09;是一种按照一定的规则&#xff0c;自动的抓取万维网信息的程序或者脚本。 学习一些爬数据的知识有什么用呢&#x…

(PC+WAP)高端大气的装修装潢公司网站模板

(PCWAP)高端大气的装修装潢公司网站模板PbootCMS内核开发的网站模板&#xff0c;该模板适用于装修公司网站、装潢公司网站等企业&#xff0c;当然其他行业也可以做&#xff0c;只需要把文字图片换成其他行业的即可&#xff1b;(PCWAP)&#xff0c;同一个后台&#xff0c;数据即…

Vue2动态代理,换服务无须重启项目

1、痛点 当我们需要使用不同的服务器时&#xff0c;就需要手动修改vue.config.js中配置并重新启动项目。当项目越来越大时&#xff0c;会需要较长的时间来等待项目启动&#xff0c;如此反复&#xff0c;极大影响我们开发进度。 2、寻求解决方案 vue-cli 的代理是使用的http-p…

新勒索软件 Shinra 与 Limpopo 浮出水面

Shinra 勒索软件概览 Shinra 勒索软件的样本文件最早在 2024 年 4 月提交给公开的文件扫描服务。攻击者在部署和运行勒索软件前会先窃取受害者的数据&#xff0c;还会删除卷影副本以阻止数据恢复。 攻击者有时会使用亚文化的人物来进行命名&#xff0c;研究人员也怀疑 Shinra…

clion远程开发

clion远程开发 简要概括&#xff1a; 建立 SFTP 通讯&#xff0c;创建远程目录与本地目录的映射文件夹&#xff0c;就可以把本机文件夹中的文件用鼠标右键选中上全传&#xff0c;打开自动同步功能&#xff0c;后面更改文件就可以自动同步文件了。 一.新建SFTP远程链接服务 …