迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或阵列)上遍访的接口,设计人员无需关心容器的内容。

在遍历容器时,我们可以使用for循环或者是增强for循环,但是不同的集合结构在遍历时,我们要针对集合特点采取不同的方式,比如List是链表,我们可以直接当做数组处理,但Map是Key—Value的形式,我们只有获取了键名才能去遍历集合内容。

很麻烦对吧?
还好JDK为我们提供了一个接口-------Iterator(迭代器),迭代器为各种容器提供了公共的操作接口。这样使得对容器的遍历操作与其具体的底层实现相隔离,达到解耦的效果。

查看Iterator的API我们得知,该接口共有3个方法:

查看API发现Collection实现了该接口,也就是说Collection的所有子实现类可使用Iterator的方法,同时在Collection中定义了一个方法iterator()

使用该方法iterator(),要求容器返回一个Iterator对象。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
那我们如何使用迭代器呢?

示例代码如下,关键代码的解释说明已经在注释部分给出,将不再做赘述。

示例代码:

/*** + 上海尚学堂 shsxt.com*/
public class TestIterator {public static void main(String[] args) {List<String> list= new ArrayList();list.add("and");list.add("try");list.add("your");list.add("best");//使用迭代器,对集合Arraylist中的元素进行取出//调用集合的方法iterator() 获取Iterator接口的实现类对象()Iterator<String> it=list.iterator();System.out.println(list.iterator().getClass());//打印的内容是 class java.util.ArrayList$Itr 既是我们的接口的实现类对象//接口实现类对象,调用方法hasNext()判断集合中是否有元素boolean b = it.hasNext();System.out.println(b);//接口的实现类对象,调用方法next()取出集合中的元素String s = it.next();System.out.println("it.next()"+s);while(it.hasNext()){/** 这里将不会输出"and",因为我们调用一次hasNext,内部的指针就会指向下一个元素*/System.out.println(it.next());}}}

会遇到的问题(并发修改异常)
我们来设想如下的场景: 在list集合迭代元素中,对元素进行判断,一旦条件满足就添加一个新元素。代码如下

/*** + VX:java8733 获取更多资源*/List<String> list2 = new ArrayList<String>();list2.add("abc");list2.add("def");list2.add("g");Iterator<String> it=list2.iterator();while(it.hasNext()){String str=it.next();if("g".equals(str)){//该操作会导致程序异常: ConcurrentModificationExceptionList2.add("b");}}System.out.println(list2);

我们会发现当我们使用迭代器遍历元素的时候,通过集合是不能修改元素的。程序抛出异常ConcurrentModificationException,这个异常指的是当方法检测到对象的并发修改,但不允许这种修改时,就会抛出此异常。

这是为什么呢? why?

 迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常。 

那我们应该如何解决呢?
首先,在迭代时,尽量不要使用集合的方法操作元素。如果要在迭代时对元素操作。我们可以通过ListIterator迭代器来操作元素。

我们可以将上面的代码做如下的修改就可以操作list中的元素了

 /*** 上海尚学堂 shsxt.com*/ListIterator<String> it=list2.listIterator();while(it.hasNext()){String str=it.next();if("a".equals(str)){//子接口ListIterator包含add()方法it.add("b");}}

上海尚学堂Java原创文章,感谢您阅读,后续Java技术文章陆续奉上,请多关注

迭代器的简单应用实践相关推荐

  1. javascript迭代器_JavaScript符号,迭代器,生成器,异步/等待和异步迭代器-全部简单解释...

    javascript迭代器 by rajaraodv 通过rajaraodv JavaScript符号,迭代器,生成器,异步/等待和异步迭代器-全部简单解释 (JavaScript Symbols, ...

  2. Excel VBA简单需求实践,包含对Excel基本的读取,校验,复写操作

    该文为想要学习VBA编程的会计和编程同学有使用VBA实现Excel自动化处理和一定的个性化定制Excel操作提供参考 第一篇为::VBA简单语法 第二篇为: Excel 编写第一个简单的VBA程序 第 ...

  3. 循环冗余校验(CRC)的简单应用实践

    前言 一般来说,数据信息在传输过程中有时会受到外界有意或无意的干扰行为,出现数据的篡改和破坏现象,造成数据接收端的不一致行为.于是乎,在信息领域有了数据校验的概念,今天本文主要来简单聊聊其中的经典使用 ...

  4. 基于Fisco-Bcos的区块链智能合约-简单案例实践

    一.智能合约介绍 智能合约是指把合同/协议条款以代码的形式电子化地放到区块链网络上.FISCO BCOS平台支持两种智能合约类型:Solidity智能合约与预编译智能合约 Solidity与Java类 ...

  5. 手把手教学编写gitlab-ci.yml文件以及应用(最简单易懂实践)

    编写gitlab-ci.yml文件以及应用 1. 在项目中创建gitlab-ci文件 把下面的内容复制进gitlab-ci文件 #流水线的stages的顺序可以自己定义 #相同阶段的任务将会并发的执行 ...

  6. 机器学习 | 一个基于机器学习的简单小实践:波斯顿房价预测分析

    本文采用Kaggle上面的Boston HousePrice数据集展示了如何建立机器学习模型的通常过程,包括以下几个阶段: 数据获取 数据清洗 探索性数据分析 特征工程 模型建立 模型集成 标签变量( ...

  7. HDFS简单介绍及用C语言訪问HDFS接口操作实践

    一.概述 近年来,大数据技术如火如荼,怎样存储海量数据也成了当今的热点和难点问题,而HDFS分布式文件系统作为Hadoop项目的分布式存储基础,也为HBASE提供数据持久化功能,它在大数据项目中有很广 ...

  8. javascript设计模式(javascript设计模式与开发实践读书笔记)

    javascript设计模式(javascript设计模式与开发实践读书笔记) 单例模式 策略模式 代理模式 迭代器模式 发布-订阅模式 命令模式 组合模式 模板方法模式 享元模式 职责链模式 中介者 ...

  9. 生成器、迭代器的区别?

    迭代器是一个更抽象的概念,任何对象,如果它的类有 next 方法和 iter 方法返回自己本身,对于 string.list. dict.tuple 等这类容器对象,使用 for 循环遍历是很方便的. ...

最新文章

  1. linux 权限 x 表示,在Linux系统中,用户对目录拥有“x”权限,表示可以执行下列哪种操作?...
  2. python学习之路基础篇(第四篇)
  3. 美媒:中国大陆最火的工作,教人工智能识图
  4. TextureView+MediaPlayer实现在线短视频播放
  5. 南安出台行动方案推进智慧城市建设
  6. Leetcode 74. 搜索二维矩阵 (每日一题 20210907)
  7. MaxCompute2.0性能评测:更强大、更高效之上的更快速
  8. java泛型(三)、通配符的使用
  9. android 反色 java_Android小米,魅族6.0状态栏不能反色解决方法
  10. IntelliJ IDEA快捷键(Shortcut)官方文档地址
  11. agv系统介绍_重载AGV小车主要结构及导航原理是什么?
  12. libevent学习笔记 一、基础知识
  13. 数据库备份恢复策略_如何根据备份策略选择和检查正确的数据库恢复模型
  14. java项目高新_java高新技术
  15. 转:tomcat7源码导入Eclipse
  16. 普通用户从非80端口启动tomcat,通过端口转发监听80端口
  17. 关于字符 字节 python3
  18. AI和大数据结合,智能运维平台助力流利说提升竞争力
  19. [爱分享]jeecms基础+导航条+例子分析
  20. C51单片机数码管动态显示

热门文章

  1. java 连接IBM MQ的方法和常见问题
  2. 【搜索引擎】全文索引数据结构和算法
  3. 【洛谷P1774】最接近神的人
  4. Xcode 7 App Transport Security has blocked a cleartext HTTP 报错解决办法
  5. 通过Small Basic把儿子/女儿带入编程的世界
  6. 测试-LoadRunner
  7. Powershell配置SharePoint环境
  8. Hadoop学习之Combiner
  9. 人人都能看懂的机器学习!3个案例详解聚类、回归、分类算法
  10. uboot主循环main_loop