第49章 Iterator迭代器

作者:张子默

一、Iterator接口

在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个接口java.util.IteratorIterator接口也是Java集合中的一员,但它与CollectionMap接口有所不同,Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被称为迭代器。

想要遍历Collection集合,那么就需要获取该集合迭代器完成迭代操作,下面介绍一下获取迭代器的方法:

  • public Iterator iterator():获取集合对应的迭代器,用来遍历集合中的元素的。

下面介绍一下迭代的概念:

迭代即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续再判断,如果还有就再取出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。

Iterator接口的常用方法如下:

  • public E next():返回迭代的下一个元素。
  • public boolean hasNext():如果仍有元素可以迭代,则返回true。

接下来我们通过案例学习如何使用Iterator迭代集合中元素:

public class IteratorDemo {public static void main(String[] args) {// 使用多态方式 创建对象Collection<String> coll = new ArrayList<String>();// 添加元素到集合coll.add("串串星人");coll.add("吐槽星人");coll.add("汪星人");//遍历//使用迭代器 遍历 每个集合对象都有自己的迭代器Iterator<String> it = coll.iterator();// 泛型指的是 迭代出 元素的数据类型while(it.hasNext()){ //判断是否有迭代元素String s = it.next();//获取迭代出的元素System.out.println(s);}}
}

tips:在进行集合元素取出时,如果集合中已经没有元素了,还继续使用迭代器的next方法,将会发生java.util.NoSuchElementException没有集合元素异常。

二、迭代器的实现原理

我们在之前的案例已经完成了Iterator遍历集合的整个过程。当遍历集合时,首先通过调用集合的iterator()方法获得迭代器对象,然后使用hasNext()方法判断集合中是否存在下一个元素,如果存在,则调用next()方法将元素取出,否则说明已经到达了集合末尾,停止遍历元素。

Iterator迭代器在遍历集合时,内部采用指针的方式来跟踪集合中的元素,下面我们通过一个图解来掩饰Iterator对象迭代元素的过程:

在调用Iterator的next方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,以此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。

三、增强for

增强for循环(也称for each循环)是JDK 1.5以后出来的一个高级for循环,专门用来遍历数组和集合的。它的内部原理其实是个Iterator迭代器,所以在遍历过程中,不能对集合中的元素进行增删操作。

格式:

for(元素的数据类型 变量 : Collection集合or数组){//写操作代码
}

它用于遍历Collection和数组。通常只进行遍历元素,不要在遍历的过程中对集合元素进行增删操作。

1、遍历数组

public class NBForDemo1 {public static void main(String[] args) {int[] arr = {3,5,6,87};//使用增强for遍历数组for(int a : arr){//a代表数组中的每个元素System.out.println(a);}}
}

2、遍历集合

public class NBFor {public static void main(String[] args) {Collection<String> coll = new ArrayList<String>();coll.add("小河神");coll.add("老河神");coll.add("神婆");//使用增强for遍历for(String s :coll){//接收变量s代表 代表被遍历到的集合元素System.out.println(s);}}
}

tips:新for循环必须有被遍历的目标。目标只能是Collection或数组。新式for仅仅作为遍历操作出现。

四、实例

  • Iterator
package com.zzm.day13.demo02;import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;/*** 用途:* 时间:2021/6/30 18:14* 创建人:张子默*//*
java.util.Iterator:迭代器(对集合进行遍历)
有两个常用的方法boolean hasNext():如果仍有元素可以迭代,则返回 true。判断集合中还有没有下一个元素,有就返回true,没有就返回falseE next():返回迭代的下一个元素。取出集合中的下一个元素
Iterator迭代器是一个接口,我们无法直接使用,需要使用Iterator接口的实现类对象,获取实现类的方式比较特殊Collection接口中有一个方法,叫iterator(),这个方法返回的就是迭代器的实现类对象Iterator<E> iterator():返回在此 collection 的元素上进行迭代的迭代器。迭代器的使用步骤(重点):1.使用集合中的方法iterator()获取迭代类的实现类对象,使用Iterator接口接收(多态)2.使用Iterator接口中的方法hasNext判断还有没有下一个元素3.使用Iterator接口中的方法next取出集合中的下一个元素*/
public class Demo01Iterator {public static void main(String[] args) {// 创建一个集合对象Collection<String> coll = new ArrayList<>();// 往集合中添加元素coll.add("姚明");coll.add("科比");coll.add("麦迪");coll.add("詹姆斯");coll.add("艾弗森");/*1.使用集合中的方法iterator()获取迭代器的实现类对象,使用Iterator接口接收(多态)注意:Iterator<E>接口也是有泛型的,迭代器的泛型跟着集合走,集合是什么泛型,迭代器就是什么泛型*/// 多态  接口             实现类对象Iterator<String> it = coll.iterator();/*发现使用迭代器取出集合中元素的代码是一个重复的过程所以我们可以使用循环优化不知道集合中有多少元素,使用while循环循环结束的条件,hasNext方法返回false*/while (it.hasNext()) {String e = it.next();System.out.println(e);}System.out.println("==============");for (Iterator<String> it2 = coll.iterator(); it2.hasNext(); ) {String e = it2.next();System.out.println(e);}/*// 2.使用Iterator接口中的方法hasNext判断还有没有下一个元素boolean b = it.hasNext();System.out.println(b); // true// 3.使用Iterator接口中的方法next取出集合中的下一个元素String s = it.next();System.out.println(s); // 姚明b = it.hasNext();System.out.println(b); // trues = it.next();System.out.println(s); // 科比b = it.hasNext();System.out.println(b); // trues = it.next();System.out.println(s); // 麦迪b = it.hasNext();System.out.println(b); // trues = it.next();System.out.println(s); // 詹姆斯b = it.hasNext();System.out.println(b); // trues = it.next();System.out.println(s); // 艾弗森b = it.hasNext();System.out.println(b); // 没有元素,返回falses = it.next(); // 没有元素,在取出元素时会抛出NoSuchElementException没有元素异常System.out.println(s); //*/}}
  • foreach
package com.zzm.day13.demo02;import java.util.ArrayList;/*** 用途:* 时间:2021/6/30 18:59* 创建人:张子默*//*
增强for循环:底层使用的也是迭代器,使用for循环的格式,简化了迭代器的书写是JDK 1.5之后出现的新特性public interface Collection<E>extends Iterable<E>,所有的单列集合都可以使用增强forpublic interface Iterable<T>实现这个接口允许对象成为 "foreach" 语句的目标。增强for循环:用来遍历集合和数组格式:for (集合/数组的数据类型 变量名 : 集合名/数组名) {sout(变量名);}*/
public class Demo02Foreach {public static void main(String[] args) {demo01();demo02();}/*使用增强for循环遍历集合*/private static void demo02() {ArrayList<String> list = new ArrayList<>();list.add("aaa");list.add("bbb");list.add("ccc");list.add("ddd");for (String s : list) {System.out.println(s);}}// 使用增强for循环遍历数组private static void demo01() {int[] arr = {1, 2, 3, 4, 5};for (int i: arr) {System.out.println(i);}}}

49_Iterator迭代器相关推荐

  1. 完全理解Python迭代对象、迭代器、生成器

    本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators,俺写的这篇文章是按照自己的理解做的参考翻译,算不上是原文的中译版本,推荐阅读原文,谢谢网 ...

  2. 2021年大数据常用语言Scala(十九):基础语法学习 iterator迭代器

    目录 iterator迭代器 使用迭代器遍历集合 iterator迭代器 scala针对每一类集合都提供了一个迭代器(iterator)用来迭代访问集合 使用迭代器遍历集合 使用iterator方法可 ...

  3. python3 内置函数map 返回的迭代器转为列表

    python3 内置函数map 返回的是迭代器,python2 返回的才是列表, 在python3中想要使用需要把迭代器在转换成列表 list_a = [1, 2, 3, 4, 5]def add(n ...

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

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

  5. python基础(迭代器,生成器,装饰器)

    python: 生成器: 因为当列表元素达到一定上限,列表会占很大内存空间来存储,所以列表是受到内存限制的来适当使用. 生成器可以按照一个算法,循环推导出元素,就不用一次生成整个列表,而通过生成器(g ...

  6. C++ 笔记(19)— 标准模板库(STL容器、STL迭代器、STL算法、STL容器特点、STL字符串类)

    C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的.独立的.不属于任何类的函数组成的.函数库继承自 C 语言. 面向对象类库: 这个库是类及其相关函数的集合. C++ 标准库包含了所有的 ...

  7. Python 列表和迭代器区别

    列表不论遍历多少次,表头位置始终是第一个元素: 迭代器遍历结束后,不再指向原来的表头位置,而是为最后元素的下一个位置. 通过 type 关键字可以看到列表和迭代器的类型是不同的. In [1]: a ...

  8. Python 高阶函数filter、map、reduce、reversed、sorted及迭代器函数 iter

    1. filter(function, iterable) 过滤器,过滤掉不满足函数 function 的元素,重新返回一个新的迭代器. 其中 function 函数的第一个参数是可迭代对象 iter ...

  9. iter迭代器的应用

    迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 用户不用关心迭代器的内部结构,仅需通过next方法不断去读取下一个内容 不能随机访问任意一个内容,只 ...

  10. Python学习笔记3 流程控制、迭代器、生成器

    第3章 流程控制.迭代器.生成器 3.1 选择语句 1.语法:(1)if -else (2)if-elif-else 2.注意:(1)每个条件后面要使用冒号:(2)使用缩进划分语句块(3)python ...

最新文章

  1. 面试了一个32岁的大佬,明显感觉到他背过很多面试题…
  2. Window10设置护眼色
  3. MySQL - 分页查询优化的两个案例解析
  4. 光流 | 基于光流法检测跟踪视频中的汽车
  5. lisp将图元追加选择_汕尾幸运儿喜爱大乐透 两次买彩票就擒获8注追加二等奖254万元...
  6. bootstrap轮播图 原点变为方块_JS实现无缝切换轮播图(自动+手动)
  7. 正则表达式 正整数_史上最全的正则表达式 (1) -- 校验数字的表达式
  8. (转)解决nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed错误
  9. Android 属性动画(三)
  10. loadrunner11下载
  11. 飞行管理计算机系统主要由什么组成,飞机结构介绍-飞行管理计算机系统.pdf
  12. SNP全称是什么? SNP是什么公司? SNP是什么意思?
  13. 自娱自乐 中秋快乐 代码
  14. Postgresql 使用 Pl/python实现邮件监控
  15. 设计模式基础学习之单例模式
  16. odroid Xu4介绍
  17. 多线程服务器的典型适用场合
  18. pdfminer转换PDF为html,【记录】尝试使用pyPdf将不可复制的PDF转换为文本或HTML
  19. 【020期】面试官问:Java 遍历 Map 集合有几种方式?效率如何?
  20. 学计算机的心理300字,心理作文300字

热门文章

  1. 发现网络计算机无法访问,小李发现其计算机无法连接网络,而办公室其它计算机网络访问正常,为了诊断故障,小李在其计算机操作系统中...
  2. html显示mysql数据库数据_html5显示mysql数据库
  3. 厕所自动系统 c语言程序,智能卫生间控制系统.doc
  4. 张雪峰大专计算机应用技术,张雪峰:这3大专科“专业”,学生失业率极高,选择要慎重!...
  5. 飞凌OKMX6ULL-C开发板试用
  6. Android 知乎广告特效的实现
  7. vue高德地图中修改标记点的图标形状、样式
  8. HRBU_20211119训练
  9. Oracle层次查询小结
  10. 商用密码应用与安全性评估之(三)商用密码应用法律政策要求