迭代器 java_Java设计模式8:迭代器模式

迭代器模式

迭代器模式又叫做游标(Cursor)模式,其作用是提供一种方法访问一个容器元素中的各个对象,而又不暴露该对象的内部细节

迭代器模式结构

迭代器模式由以下角色组成:

1、迭代器角色

负责定义访问和遍历元素的接口

2、具体迭代器角色

实现迭代器接口,并要记录遍历中的当前位置

3、容器角色

负责提供创建具体迭代器角色的接口

4、具体容器角色

实现创建具体迭代器角色的接口,这个具体迭代器角色与该容器的结构相关

迭代器模式在JDK中的应用及解读

迭代器模式就不自己写例子了,直接使用JDK中的例子。为什么我们要使用迭代器模式,思考一个问题,假如我有一个ArrayList和一个LinkedList:

912a095f5096968190928ee9c65404db.png

如何去遍历这两个List相信每个人都很清楚:

3753225d03ba512934f564bfa0e7c22c.png

运行结果为:

cda66d78eaa5b7836ae0826c9f26b63d.png

这是因为恰好,我们知道ArrayList和LinkedList的访问方式,有些喜欢研究的人知道ArrayList和LinkedList的内部结构,但如果现在我给你一个HashSet:

01e90e267374d881c0268cc93d842b1e.png

将如何遍历?可能你还以为可以使用类似List的遍历方式,不过很遗憾,HashSet中根本没有提供get方法。

这时候就轮到迭代器出场了,不管是什么数据结构,不管你听过还是没听过,不管你见过还是没见过,只要它实现了Iterable接口,都可以用类似的方式去遍历,我把ArrayList、LinkedList、HashSet的遍历写在一起:

e4792919238f51426ef3e5e211929ca1.png

看一下运行结果:

516208a1fac80eafe5c866bb385150b7.png

看到这就遍历出来ArrayList、LinkedList、HashSet了,以后遇到一个集合,只要实现了iterable接口,也都可以类似这么遍历。这就是开头迭代器模式的定义说的,开发者不需要知道集合中如何去遍历的细节,只管用类似的遍历方法就好了。

Iterable接口和Iterator接口

这两个都是迭代相关的接口,可以这么认为,实现了Iterable接口,则表示某个对象是可被迭代的;Iterator接口相当于是一个迭代器,实现了Iterator接口,等于具体定义了这个可被迭代的对象时如何进行迭代的。参看Iterable接口的定义:

f96a2b9a762532a6200ed45ec3557fd4.png

这样对象就可以使用这个类的迭代器进行迭代了,一般Iterable和Iterator接口都是结合着一起使用的。为什么一定要实现Iterable接口而不直接实现Iterator接口了呢,这个问题我也是在自己写了ArrayList和LinkedList的实现之后才想明白的,这么做确实有道理:

因为Iterator接口的核心方法next()或者hasNext()都是依赖于迭代器的当前迭代位置的。如果Collection直接实现Iterator接口,势必导致集合对象中包含当前迭代位置的数据,当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知的。除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。但即使这样,Collection也同时只能存在一个当前迭代位置。而Iterable,每次调用都返回一个从头开始计数的迭代器,多个迭代器时互不干扰。

可能这么解释不是很明白,再解释明白一点,我自己写的一个ArrayList,如果直接实现Iterator接口,那么势必是这么写的:

4b9448e7b23e3b5d24e2de5280c53e86.png

这么问题就来了,如果一个ArrayList实例被多个地方迭代,next()方法、hasNext()直接操作的是ArrayList中的资源,假如我在ArrayList中定义一个迭代位置的变量,那么对于不同调用处,这个迭代变量是共享的,线程A迭代的时候将迭代变量设置成了第5个位置,这时候切换到了线程B,对于线程B来讲,就从第5个位置开始遍历此ArrayList了,根本不是从0开始,如何正确迭代?

实现Iterable接口返回一个Iterator接口的实例就不一样了,我为自己写的ArrayList定义一个内部类:

363056ae497ec91d17edb2036ff537b5.png

每次都返回一个返回一个ArrayListIterator实例出去:

61bff0a316518ab7f352815f94a18cf7.png

这就保证了,即使是多处同时迭代这个ArrayList,依然每处都是从0开始迭代这个ArrayList实例的。

迭代器模式的优缺点

优点

1、简化了便利方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,我们还可以通过下标来获取,但用户需要在对集合很了解的情况下,才能自行遍历对象(有时即使你了解了集合,还未必能直接遍历,比如上面的HashSet就没有提供get方法)。而引入了迭代器方法后,用户用起来就简单地多了

2、可以供多种遍历方式,比如对于有序列表,可以正向遍历也可以倒序遍历,只要迭代器实现得好

3、封装性好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心

缺点

对于比较简单的遍历(数组或者有序列表),使用迭代器方式遍历较为繁琐而且遍历效率不高,使用迭代器的方式比较适合那些底层以链表形式实现的集合

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

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

相关文章

网易 html5,别再想不开做H5了

写这篇文章的时候网易哒哒《饲养手册》H5刷屏了,但我们依旧不建议品牌做H5。H5作为大众传播工具的时代,已经过去了。尽管去年有很多H5曾经刷屏过,但在当时我们就一直跟朋友说,不要再尝试H5了,性价比根本算不过来&#…

flex 修改生成html,CSS Flex –动画教程

如果一张图片胜过千言万语 —— 那么动画呢? Flex 无法通过文字或静态图像有效地完全解释。为了巩固你对flex的了解,我制作了这些动画演示。注意 overflow: hidden 行为类型是默认值,因为 flex-wrap 还未设置。为了获得更好的想法&#xff0c…

陕西2021高考成绩在哪查询,2021陕西高考成绩查询入口

2021陕西高考成绩查询入口2021-05-13 19:38:37文/张敏有很多同学在关注2021年陕西高考成绩的查询方式,为了方便考生们查询成绩,小编整理了陕西高考成绩查询入口,希望对同学们有帮助。2021陕西高考成绩查询通道高考成绩查询过后应该做什么1、了…

查找文件中每行第二个单词_日语单词中的长短音区别在哪里,日语长短音发音有什么规律...

日语单词记忆长短音规律一、如果单词的汉字在中文汉语拼音中是前鼻音,在日语读音中就会带拨音「ん」; 如果单词的汉字在中文汉语拼音中是后鼻音,在日语读音中就会带有长音。例:専门(zhuan men)-…

SQL Server 执行计划利用统计信息对数据行的预估原理二(为什么复合索引列顺序会影响到执行计划对数据行的预估)...

本文出处:http://www.cnblogs.com/wy123/p/6008477.html 关于统计信息对数据行数做预估,之前写过对非相关列(单独或者单独的索引列)进行预估时候的算法,参考这里。  今天来写一下统计信息对于复合索引在预估时候的计…

哈密顿路径_检查图形是否为哈密顿量(哈密顿路径)

哈密顿路径Problem Statement: 问题陈述: Given a graph G. you have to find out that that graph is Hamiltonian or not. 给定图G。 您必须找出该图是否为哈密顿量 。 Example: 例: Input: 输入: Output: 1 输出1 Because here is a …

京东自动下单软件_黄牛软件自动下单秒杀商品 警方用科技手段打击

法制日报全媒体记者 张维定了10个闹钟,也抢不到一瓶茅台;等了很久的iPhone新手机,打开网页就秒没……或许并不是因为你的手速、网速慢,而是黄牛党在用软件和你抢商品。近日,在“净网2019”专项行动中,阿里安全协助江苏省南通市公安局成功打掉了一个制作销售黄牛软件…

河南招教考试计算机专业知识,河南教师招聘考试《计算机网络技术基础》知识点归纳七...

河南教师招聘考试《计算机网络技术基础》知识点归纳七1.ADSL是非对称数字用户线路,其下行速率为1.5~8 Mb/s,而上行速率则为16~640 kb/s。在一对铜双绞线上的传送距离可达5km左右,可同时上网打电话,互不影响…

content属性的4种用途

content属性浏览器支持情况&#xff0c;兼容到IE8浏览器&#xff0c;IE7及以下不支持用途一、配合:before及:after伪元素插入文本<div><p>伪元素</p> </div>p:before{content:CSS3;color:#4bb;font-weight:bold;margin-right:20px;background:#f0f0f0;…

内蒙古师范大学计算机科学技术学院,内蒙古师范大学计算机科学技术硕士生导师——李成城...

李成城&#xff0c;教授&#xff0c;硕导&#xff0c;1971年7月出生于内蒙古呼伦贝尔盟。2002年9月-2005年7月在北京邮电大学信息工程学院学习&#xff0c;获得工学博士学位&#xff0c;主要研究领域是&#xff1a;自然语言理解、机器学习、图像识别。1993年在内蒙古师范大学计…

超清世界地图可放大_3D高清世界地图

查看世界地图的工具有哪些可以提供呢&#xff1f;3D世界地图官方版是简单好用的世界地图工具&#xff0c;可以看到地球的大概模样&#xff0c;选择不一样的海洋能看到不一样的事物&#xff0c;这也是一款3d世界地图高清地图&#xff0c;需要用地图软件的可以下载。3D世界地图官…

工欲善其事必先利其器(一)

2019独角兽企业重金招聘Python工程师标准>>> 写在前面的话&#xff1a;纸上得来终学浅&#xff0c;绝知此事要躬行。还是自己敲一遍记得牢。 下载和安装 Emmet为大部分流行的编辑器都提供了安装插件&#xff0c;下面是它们的下载链接&#xff1a; Sublime Text Ecli…

windows 2008r2文件服务器部分用户访问不了_苹果设备如何访问 Windows 文件共享?...

前几天写了一篇关于 Mac 文件共享的。今天继续聊聊 Mac、iPad 和 iPhone 如何访问 Windows 的文件共享。Windows 开启文件共享Windows 搜索并打开「高级共享设置」。在「专用」勾选「启用网络发现」和「启用文件和打印机共享」。然后选择一个 Windows 上想要共享的位置&#xf…

微信小程序简单入门1

参考文档&#xff1a;https://mp.weixin.qq.com/debug/wxadoc/dev/index.html1 创建项目开发者工具安装完成后&#xff0c;打开并使用微信扫码登录。选择创建“项目”&#xff0c;填入上文获取到的 AppID &#xff0c;&#xff08;无appid直接选择&#xff09;设置一个本地项目…

leetcode数组汇总_LeetCode刷题实战118:杨辉三角

算法的重要性&#xff0c;我就不多说了吧&#xff0c;想去大厂&#xff0c;就必须要经过基础知识和业务逻辑面试算法面试。所以&#xff0c;为了提高大家的算法能力&#xff0c;这个公众号后续每天带大家做一道算法题&#xff0c;题目就从LeetCode上面选 &#xff01;今天和大家…

多线程下不能用truncate吗_那么多的化妆品,怀孕后都不能用了吗?

前几天圆梦参加了青岛的美博会&#xff0c;里面的化妆品真多啊&#xff0c;无论是护肤、美白、彩妆比比皆是&#xff0c;看的人眼&#xff08;liu&#xff09;花&#xff08;lian&#xff09;缭&#xff08;wang&#xff09;乱&#xff08;fan&#xff09;。虽说国务院宣布的新…

手机html5性能测试工具,HTML5模块 性能方面8大测试环节_小米 M3_手机硬件频道-中关村在线...

Vellamo作为一款专攻网页浏览性能测试的工具&#xff0c;在这方面的测试环节也相对复杂很多。这一部分在Vellamo的HTML5测试环节中通过14项测试来进行体现&#xff0c;而接下来我们会对着实际个测试项进行相应的介绍。See The Sun Canvas/Pixel Blender测试界面See The Sun Can…

[计算机网络]httpserver--如何解析HTTP请求报文

这个http server的实现源代码我放在了我的github上&#xff0c;有兴趣的话可以点击查看哦。 在上一篇文章中&#xff0c;讲述了如何编写一个最简单的server&#xff0c;但该程序只是接受到请求之后马上返回响应&#xff0c;实在不能更简单。在正常的开发中&#xff0c;应该根据…

英特尔核芯显卡控制面板没有了_核显和独显、集成显卡有什么区别

集成显卡&#xff1a;一般不带有显存&#xff0c;而是使用系统的一部分主内bai存作为显存&#xff0c;具体的数量一般是系统根据需要自动动态调整的。显然&#xff0c;如果使用集成显卡运行需要大量占用内存的空间&#xff0c;对整个系统的影响会比较明显&#xff0c;此外系统内…

徐州初中计算机学校排名2015,徐州初中学校排名,徐州重点初中排名详细榜单

2018年徐州初中学校排名,徐州重点初中排名详细榜单孩子小升初&#xff0c;几乎所有的家长都会陷入纠结&#xff0c;都想为孩子选择一所“好学校”&#xff0c;在择校过程中&#xff0c;家长们总想知道徐州初中学校排名以及徐州重点初中排名详细榜单&#xff0c;但这里小编提醒一…