迭代器(Iterator)

迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

Java中的Iterator功能比较简单,并且只能单向移动:

(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。

(2) 使用next()获得序列中的下一个元素。

(3) 使用hasNext()检查序列中是否还有元素。

(4) 使用remove()将迭代器新返回的元素删除。

Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
  迭代器的应用:

list l = new ArrayList();l.add("aa");l.add("bb");l.add("cc");for (Iterator iter = l.iterator(); iter.hasNext();) {String str = (String)iter.next();System.out.println(str);}/*迭代器用于while循环Iterator iter = l.iterator();while(iter.hasNext()){String str = (String) iter.next();System.out.println(str);}*/

Iterator的接口定义:

public interface Iterator {  boolean hasNext();  Object next();  void remove();
}

使用: Object next():返回迭代器刚越过的元素的引用,返回值是Object,需要强制转换成自己需要的类型

boolean hasNext():判断容器内是否还有可供访问的元素

void remove():删除迭代器刚越过的元素

迭代使用方法:(迭代其实可以简单地理解为遍历,是一个标准化遍历各类容器里面的所有对象的方法类)

for(Iterator it = c.iterator(); it.hasNext(); ) {  Object o = it.next();  //do something
}

使用iterator()方法时经常会遇到ConcurrentModificationException异常,这通常是由于在使用Iteraor遍历容器的同时又对容器做增加或删除操作所导致的,或者由于多线程操作导致,当一个线程使用迭代器遍历容器的同时,另外一个线程对这个容器进行增加或删除操作。


package com.js;
/*** Iterator使用Demo*/
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;public class Test {public void main(String[] args){List<String> ll = new LinkedList<String>();ll.add("first");ll.add("second");ll.add("third");ll.add("fourth");for(Iterator<String> iterator = ll.iterator();iterator.hasNext();){String string = (String)iterator.next();System.out.println(string);if(string.equals("second"))ll.add("fifth");}}
}

运行结果为:
first
second
Exception in thread “main” java.util.ConcurrentModificationException
at java.util.LinkedListListItr.checkForComodification(UnknownSource)atjava.util.LinkedListListItr.checkForComodification(Unknown Source) at java.util.LinkedListListItr.checkForComodification(UnknownSource)atjava.util.LinkedListListItr.next(Unknown Source)
at com.js.Test.main(Test.java:17)

抛出上述异常的主要原因是当条用容器的iterator()方法返回Iterator对象时,把容器中包含对象的个数赋值给了一个变量expectedModCount,在调用next()方法时会比较变量expectedModCount与容器中实际对象的个数modCount的值是否相等,若二者不相等,则会抛出ConcurrentModificationException异常,因此在使用Iterator遍历容器的过程中,如果对容器进行增加或删除操作,就会改变容器中对象的数量,从而导致抛出异常。解决办法如下:在遍历的过程中把需要删除的对象保存到一个集合中,等遍历结束后再调用removeAll()方法来删除,或者使用iterator.remove()方法。

引申:Iterator和ListIterator有什么区别?

Iterator只能正向遍历集合,适用于获取移除元素。ListIterator继承自Iterator,专门针对List,可以从两个方向来遍历List,同时支持元素的修改。

参考链接:https://blog.csdn.net/dove_knowledge/article/details/71023512

Java中Iterator用法相关推荐

  1. java中Iterator用法总结

    Java中Iterator用法 迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为"轻量级& ...

  2. java中iterator用法_java_详解Java中Iterator迭代器的用法,迭代器(Iterator)迭代 - phpStudy...

    详解Java中Iterator迭代器的用法 迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为&quo ...

  3. Java中Iterator用法整理

    迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为"轻量级"对象,因为创建它的代价 ...

  4. java中import用法

    java中import用法 单类型导入(single-type-import),例如import java.io.File; 按需类型导入(type-import-on-demand),例如 impo ...

  5. java中extends用法_JAVA的extends用法

    理解继承是理解面向对象程序设计的关键.在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类).在Java中不允许多继承. (1)继承 cla ...

  6. java中continue用法

    java中continue用法 有时强迫一个循环提早反复是有用的,也就是,你可能想要继续运行循环,但是要忽略这次重复剩余的循环体的语句,所以 java提供了 continue 语句.continue ...

  7. java中switch用法举例范围_Java中Switch用法代码示例

    一.java当中的switch与C#相比有以下区别 注:在java中switch后的表达式的类型只能为以下几种:byte.short.char.int(在Java1.6中是这样), 在java1.7后 ...

  8. java中nextInt()用法

    java中nextInt用法 功能 函数实现 三级目录 功能 给定一个参数n,nextInt(n)将返回一个大于等于0小于n的随机数,即:0 <= nextInt(n) < n. 函数实现 ...

  9. Java中Iterator类的详细介绍

    迭代器模式:就是提供一种方法对一个容器对象中的各个元素进行访问,而又不暴露该对象容器的内部细节. 概述 Java集合框架的集合类,我们有时候称之为容器.容器的种类有很多种,比如ArrayList.Li ...

最新文章

  1. 药理学css概念,药理学css 名词解释
  2. VTK修炼之道75:交互部件_测量类Widget的应用
  3. 【152】C# 操作 Excel 杂记
  4. 为了实现在线库的复杂查询,你还在双写吗?
  5. python修改y轴刻度_Python | Y轴刻度限制
  6. js 自定义 $ 选择器
  7. css3 下拉缩放显示定位导航
  8. python中debug和run有什么区别_android应用程序开发中run和debug 有什么区别?
  9. 用python建云盘_超简单!基于Python搭建个人“云盘”
  10. maya_Vray模型属性批量修改插件 v1.01 下载及教程
  11. web项目中镶嵌player
  12. adams c语言,Adams2013编译C语言用户子程序生成dll超详细教程讲解
  13. 量化交易----常见股票特征和编程实现
  14. 如何找到隐式转换的SQL?
  15. 无线分组网关系统解决方案(GGSN、PDSN)
  16. 自然语言处理(NLP)的八个国际顶级会议!
  17. MATLAB设计课题推荐及选择老师技巧
  18. Elastic:使用 Elastic Stack 来监督系统日志及指标
  19. 优维助力国内某省级商业银行同城异地灾备自动化建设
  20. '.'和'..'还有'./'和'../'

热门文章

  1. 山西大同大学计算机考研,山西大同大学是几本?考研情况怎样?
  2. html数组拼接js,javascript合并两个数组最简单的实现方法
  3. 2022年阿里高频Java面试题:分布式+中间件+高并发+算法+数据库
  4. sqlserver增加表字段 给report_smart这个表增加a50 a51 a52‘‘‘‘ a59几个字段
  5. 佛与牛粪——苏东坡与佛印的故事
  6. 编程将外部RAM2000H--202FH单元中的内容,移入内部RAM20H--4FH中,并将原数据块区域清0.
  7. redis初学者教程—带你进入不一样的世界
  8. vscode中python配置(yapf与flake8)
  9. oracle默认管理员的帐号和密码
  10. Vue定时器及原理与TS封装