Windows环境下JDK内置迭代器的简介

news2024/9/21 11:11:20

我是荔园微风,作为一名在IT界整整25年的老兵,今天讨论一下Windows环境下JDK内置迭代器。

相信大家已经注意到,为了让广大程序员能够更加方便地操作聚合对象,在Java、C#等编程语言中都提供了内置迭代器。

如果对这种迭代器还不了解,可以看我之前的一篇贴子:

Windows环境下实现设计模式——迭代器模式(JAVA版)

如果有JAVA和C#开发经验的同学,一定会注意到,在Java集合框架中,常用的List和Set等聚合类都继承或实现了java.util.Collection接口,在Collection接口中声明了如下方法: 

package java.util;
 
public interface Collection<E> extends Iterable<E> {
    ……
    boolean add(Object c);
    boolean addAll(Collection c);
    boolean remove(Object o);
    boolean removeAll(Collection c);
    boolean remainAll(Collection c); 
    Iterator iterator();
    ……
}

除了包含一些增加元素和删除元素的方法外,还提供了一个iterator()方法,用于返回一个Iterator迭代器对象,以便遍历聚合中的元素;具体的Java聚合类可以通过实现该iterator()方法返回一个具体的Iterator对象。JDK中定义了抽象迭代器接口Iterator,代码如下所示:

package java.util;
 
public interface Iterator<E> {
    boolean hasNext();
    E next();
    void remove();
}

其中,hasNext()用于判断聚合对象中是否还存在下一个元素,为了不抛出异常,在每次调用next()之前需先调用hasNext(),如果有可供访问的元素,则返回true;next()方法用于将游标移至下一个元素,通过它可以逐个访问聚合中的元素,它返回游标所越过的那个元素的引用;remove()方法用于删除上次调用next()时所返回的元素。

Java迭代器工作原理就是在第一个next()方法被调用时,迭代器游标由“元素1”与“元素2”之间移至“元素2”与“元素3”之间,跨越了“元素2”,因此next()方法将返回对“元素2”的引用;在第二个next()方法被调用时,迭代器由“元素2”与“元素3”之间移至“元素3”和“元素4”之间,next()方法将返回对“元素3”的引用,如果此时调用remove()方法,即可将“元素3”删除。


 

如下代码片段可用于删除聚合对象中的第一个元素:

Iterator iterator = collection.iterator();   //collection是已实例化的聚合对象
iterator.next();	 	// 跳过第一个元素
iterator.remove(); 	// 删除第一个元素

需要注意的是,在这里,next()方法与remove()方法的调用是相互关联的。如果调用remove()之前,没有先对next()进行调用,那么将会抛出一个IllegalStateException异常,因为没有任何可供删除的元素。如下代码片段可用于删除两个相邻的元素:

iterator.remove();
iterator.next();  //如果删除此行代码程序将抛异常
iterator.remove();  

在上面的代码片段中如果将代码iterator.next();去掉则程序运行抛异常,因为第二次删除时将找不到可供删除的元素。

在JDK中,Collection接口和Iterator接口充当了迭代器模式的抽象层,分别对应于抽象聚合类和抽象迭代器,而Collection接口的子类充当了具体聚合类,下面以List为例加以说明,下面列出了JDK中部分与List有关的类及它们之间的关系:
 

在JDK中,实际情况要复杂很多,在上中,List接口除了继承Collection接口的iterator()方法外,还增加了新的工厂方法listIterator(),专门用于创建ListIterator类型的迭代器,在List的子类LinkedList中实现了该方法,可用于创建具体的ListIterator子类ListItr的对象,代码如下所示:
 

public ListIterator<E> listIterator(int index) {
    return new ListItr(index);
}

 listIterator()方法用于返回具体迭代器ListItr类型的对象。在JDK源码中,AbstractList中的iterator()方法调用了listIterator()方法,如下代码所示:

public Iterator<E> iterator() {
    return listIterator();
}

客户端通过调用LinkedList类的iterator()方法,即可得到一个专门用于遍历LinkedList的迭代器对象。

在Java语言中,我们可以直接使用JDK内置的迭代器来遍历聚合对象中的元素,下面的代码演示了如何使用Java内置的迭代器:

import java.util.*;
 
class IteratorDemo {
   public static void process(Collection c) {
   	  	Iterator i = c.iterator(); //创建迭代器对象
		
        //通过迭代器遍历聚合对象
		while(i.hasNext()) {
			System.out.println(i.next().toString());
		}
   }
 
	public static void main(String args[]) {
	    Collection persons;
        persons = new ArrayList(); //创建一个ArrayList类型的聚合对象
		persons.add("员工1");
		persons.add("员工2");
		persons.add("员工3");
		persons.add("员工4");
		persons.add("员工5");
		persons.add("员工2");
		
		process(persons);
	}
}

在静态方法process()中使用迭代器Iterator对Collection对象进行处理,该代码运行结果如下:

员工1

员工2

员工3

员工4

员工5

员工2

如果需要更换聚合类型,如将List改成Set,则只需更换具体聚合类类名,如将上述代码中的ArrayList改为HashSet,则输出结果如下:

员工3

员工1

员工4

员工2

员工5

在HashSet中合并了重复元素,并且元素以随机次序输出,其结果与使用ArrayList不相同。由此可见,通过使用迭代器模式,使得更换具体聚合类变得非常方便,而且还可以根据需要增加新的聚合类,新的聚合类只需要实现Collection接口,无须修改原有类库代码,符合“开闭原则”。
 

各位小伙伴,这次我们就说到这里,下次我们再深入研究windows环境下的各类设计模式实现。

作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。
 
 

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

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

相关文章

在JetsonNano上安装PREEMPT-RT实时核+IghEtherCAT主站的详细步骤

特别说明&#xff1a;由于本人空闲时间有限&#xff0c;此博客中所有内容均是从本人的个人笔记中摘抄出来&#xff0c;命令行大多以图片形式展示&#xff0c;不能提供复制粘贴功能敬请体谅。此外&#xff0c;第一部分关于在 Jetson Nano 上安装PREEMPT-RT 实时核的步骤比较详细…

企业工商四要素核验 API:有效应对商业欺诈和恶意交易的利器

引言 企业工商四要素核验是一种用于验证企业基本信息的方法&#xff0c;主要包括企业名称、社会统一信用代码、法人名称、法人身份证四个要素。这些要素是企业注册时必须提供的信息&#xff0c;通过对这些信息的验证&#xff0c;可以确定企业的真实性和合法性&#xff0c;通常…

【力扣-21】合并两个有序链表

&#x1f58a;作者 : Djx_hmbb &#x1f4d8;专栏 : 数据结构 &#x1f606;今日分享 : 英文文章里 : TL;DR 或者 tl;dr。 网上英文解释有两种&#xff0c;一种是Too long;Don’t read&#xff0c;另一种是Too long;Didn’t read。意思是&#xff1a;“文章太长了&#xff0c;读…

Stable Diffusion MacBookAir 手把手安装教程,以及checkpoint安装、Lora安装、civitai介绍。

目标&#xff1a; 本地部署Stable Diffusion 安装步骤&#xff1a; 安装git Git - Downloadshttps://git-scm.com/downloads安装python 3.10.6 Python Releases for macOS | Python.orgThe official home of the Python Programming Languagehttps://www.python.org/downl…

再捐1亿元种树治沙:蚂蚁集团持续七年支持内蒙古生态治理

今天&#xff08;4月22日&#xff09;是“世界地球日”&#xff0c;内蒙古自治区林草局与蚂蚁集团启动战略合作&#xff1a;由蚂蚁集团在三年内再捐资1亿元&#xff0c;通过公益项目“蚂蚁森林”支持浑善达克沙地的生态治理。这1亿元将用于当地林草生态的修复保护、沙化土地的治…

助力电力行业数字化,BI 大有可为

各地密集上马的电力工程为上下游产业链发展带去了更多市场机遇&#xff0c;“三零”“三省”办电服务的推广让企业获得了看得见、摸得着的实惠&#xff0c;电力行业正在以自身高质量发展新成效助力经济稳增长&#xff0c;为扎实推进中国式现代化建设注入强劲动能。 电力行业是…

Spring Cloud Gateway Actuator API SpEL表达式注入命令执行(CVE-2022-22947)

Spring Cloud Gateway Actuator API SpEL表达式注入命令执行&#xff08;CVE-2022-22947&#xff09; 0x00 前言 Spring Cloud Gateway是Spring中的一个API网关。其3.1.0及3.0.6版本&#xff08;包含&#xff09;以前存在一处SpEL表达式注入漏洞&#xff0c;当攻击者可以访问…

plt.title()函数中文无法显示问题

文章目录 问题描述解决办法plt.title()函数参数说明 问题描述 由于画图时plt.title()默认是显示英文&#xff0c;如果我们设置标题为中文&#xff0c;会无法显示&#xff0c;如图&#xff1a; plt.title(训练损失) plt.plot(np.arange(len(losses)), losses, -o, colorred) p…

快速学会 IDEA 中 Git 的使用与 GitHub 仓库创建、连接、发布

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; 目录 一、Git &#x1f334;1.Git 工作流程2.Git 安装3.常用命令4.分支 二、远程仓库 GitHub &#x1f335;1.注册使用2.配置 SSH 公钥3.在 IDEA 中配置3.IDEA to GitHub4.创建分支5.commit 到仓库6.从远程仓库中抓…

【数据结构与算法】无队头指针的队列置空队、判队空 、入队和出队算法

题目 Qestion&#xff1a; 假设以带头结点的循环链表表示队列&#xff0c;并且只设一个指针指向队尾元素结点 (注意不设头指针) &#xff0c;试编写相应的置空队、判队空、入队和出队等算法。 核心思路 该队列的特殊之处&#xff1a; 用链表来表示队列该链表为带头节点的链表该…

VM ware workstation安装mac虚拟机

一. 工具准备 VMware workstation mac os的镜像文件&#xff08;链接&#xff1a;https://pan.baidu.com/s/1AdDGFU186bqKvW4wuGtpqw &#xff0c;提取码&#xff1a;tdvc&#xff09; 下载一个auto-unlocker文件&#xff08;https://github.com/paolo-projects/auto-unlocke…

人工智能十大流行算法,通俗易懂讲明白

人工智能是什么&#xff1f;很多人都知道&#xff0c;但大多又都说不清楚。 事实上&#xff0c;人工智能已经存在于我们生活中很久了。 比如我们常常用到的邮箱&#xff0c;其中垃圾邮件过滤就是依靠人工智能&#xff1b;比如每个智能手机都配备的指纹识别或人脸识别&#x…

「QT」QT中new的对象不需要delete的原因

博客主页:何曾参静谧的博客 文章专栏:「QT」QT5快速学习 目录 说明注意事项说明 在QT中,一般来说,通过new关键字创建的对象由QT的对象树来管理,而通过其他方式创建的对象就需要手动释放。QT的对象树可以看做是QT提供的一种内存管理机制,它能够自动地管理和释放对象的内存…

Xilinx之7系列时钟规划失败解析

目录 一 、前言 二、时钟规划 ​2.1 时钟单元经过非时钟路径 2.2 资源不足 2.3 跨半区 一 、前言 在设计的工程中&#xff0c;经常会在implementation的布局或布线阶段失败&#xff0c;下面将针对xilinx 7系列时钟规划失败的场景进行分类描述。本文示例器件为xc7k480tffv1…

华为笔记本怎么录屏?分享2个实用方法

案例&#xff1a;如何对华为笔记本电脑进行屏幕录制&#xff1f; 【今天刚刚了解到电脑可以录屏&#xff0c;但是我拿着我的华为电脑找了半天&#xff0c;也找不到它的屏幕录制功能在哪。华为电脑录屏功能在哪&#xff1f;华为笔记本怎么录屏&#xff1f;有没有大神可以教教我…

DNS缓存失效,nginx死循环访问造成连接数瞬间飚高的问题

0.背景介绍 某服务domain.com.cn 之前DNS解析到服务真实地址10.1.1.11&#xff0c;后面需要对用户登录增加黑名单功能&#xff0c;于是在openresty针对服务domain.com.cn的特性完成了黑名单功能。黑名单功能已经上线几个月&#xff0c;但是DNS从服务真实地址10.1.1.11切换到ope…

Spring MVC 参数解析(13)

目录 简介 调用流程 1. 首先&#xff0c;还是需要进行到前端控制器的doDispatch方法&#xff0c;这是我们的调用Spring MVC的核心入口方法 2. 在doDispatch方法内部&#xff0c;我们调用到了HandlerAdapter.handle(*****) 方法 3. 最终&#xff0c;我们会来到 RequestMappi…

完美解决丨2. `TypeError: list indices must be integers or slices, not str`

‘tuple’ object does not support item assignment 原因&#xff1a; tuple 是一个元素不可变的列表&#xff0c;如果尝试对 tuple 中的某个元素进行修改&#xff0c;会报错。 解决办法&#xff1a; 需要将 tuple 转换为 list&#xff0c;然后再把 list 转换为 tuple。 示例…

最长公共上升子序列LCIS

最长公共上升子序列LCIS 题目链接: acwing272. 最长公共上升子序列 题目描述: 输入输出: 题解: 首先考虑 最长上升子序列和 最长公共子序列问题 最长上升子序列的状态表示与状态转移如下: 状态表示: 用f[i],来表示以A[i]结尾的A[1~i]最长上升子序列的长度(注意&#xff0c;该上…

WPF教程(三)--事件Event调用

1、WPF应用程序的关闭 WPF应用程序的关闭只有在应用程序的 Shutdown 方法被调用时&#xff0c;应用程序才停止运行。 ShutDown 是隐式或显式发生&#xff0c;可以通过指定 ShutdownMode 的属性值来进行设置。 对ShutdownMode选项的更改&#xff0c;可以直接在App.xaml中更改&a…