• 49_Iterator迭代器


    第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);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    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数组){
    	//写操作代码
    }
    
    • 1
    • 2
    • 3

    它用于遍历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);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    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,没有就返回false
        E 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); // true
            s = it.next();
            System.out.println(s); // 科比
    
            b = it.hasNext();
            System.out.println(b); // true
            s = it.next();
            System.out.println(s); // 麦迪
    
            b = it.hasNext();
            System.out.println(b); // true
            s = it.next();
            System.out.println(s); // 詹姆斯
    
            b = it.hasNext();
            System.out.println(b); // true
            s = it.next();
            System.out.println(s); // 艾弗森
    
            b = it.hasNext();
            System.out.println(b); // 没有元素,返回false
            s = it.next(); // 没有元素,在取出元素时会抛出NoSuchElementException没有元素异常
            System.out.println(s); //*/
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 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>,所有的单列集合都可以使用增强for
        public 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);
            }
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
  • 相关阅读:
    【蓝桥杯软件赛 零基础备赛20周】第4周——简单模拟1
    python循环改变循环体的操作
    极限多标签分类-评价指标
    tomcat目录下创建临时文件,长时间没有使用会被系统清理掉
    Elasticsearch
    使用Docker搭建WordPress私人博客
    Vue框架总结(一、Vue基础知识)
    第二证券:产业资本真金白银传递市场信心
    基于python+scrapy的租房信息数据展示系统
    《机器学习》李宏毅P5-8
  • 原文地址:https://blog.csdn.net/a1448824839/article/details/125613025