• 11-3 Iterator迭代器接口


    使用 Iterator 接口遍历集合元素

    • Iterator对象称为迭代器(设计模式的一种),主要用于遍历 Collection 集合中的元素。
    • GOF给迭代器模式的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。迭代器模式,就是为容器而生。类似于“公交车上的售票员”、“火车上的乘务员”、“空姐”。
    • Collection接口继承了java.lang.Iterable接口,该接口有一个iterator()方法,那么所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象。
    • Iterator 仅用于遍历集合,Iterator 本身并不提供承装对象的能力。如果需要创建Iterator 对象,则必须有一个被迭代的集合。
    • 集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前。
      在这里插入图片描述
     @Test
        public void test(){
            Collection coll = new ArrayList();
            coll.add(123);
            coll.add(456);
            coll.add(new Person("Jerry",20));
            coll.add(new String("Tom"));
            coll.add(false);
    
            Iterator iterator = coll.iterator();
    
            //方式一:
    //        System.out.println(iterator.next());
    //        System.out.println(iterator.next());
    //        System.out.println(iterator.next());
    //        System.out.println(iterator.next());
    //        System.out.println(iterator.next());
    //        //报异常:NoSuchElementException
    //        //因为:在调用it.next()方法之前必须要调用it.hasNext()进行检测。若不调用,且下一条记录无效,直接调用it.next()会抛出NoSuchElementException异常。
    //        System.out.println(iterator.next());
    
            //方式二:不推荐
    //        for(int i = 0;i < coll.size();i++){
    //            System.out.println(iterator.next());
    //        }
    
            //方式三:推荐
            while(iterator.hasNext()){
                System.out.println(iterator.next());
            }
        }
    
    • 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

    迭代器的执行原理

    在这里插入图片描述

    错误写法

        public void test2(){
            Collection coll = new ArrayList();
            coll.add(123);
            coll.add(456);
            coll.add(new Person("Jerry",20));
            coll.add(new String("Tom"));
            coll.add(false);
    
            //错误方式一:
    //        Iterator iterator = coll.iterator();
    //        while(iterator.next() != null){
    //            System.out.println(iterator.next());
    //        }
    
            //错误方式二:
            //集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前。
            while(coll.iterator().hasNext()){
                System.out.println(coll.iterator().next());
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    错误方式一:
    456
    Tom
    java.util.NoSuchElementException
    at java.util.ArrayList$Itr.next(ArrayList.java:862)

    错误方式二:
    集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前。
    死循环输出123


    测试Iterator中的remove()方法

            Collection coll = new ArrayList();
            coll.add(123);
            coll.add(456);
            coll.add(new Person("Jerry",20));
            coll.add(new String("Tom"));
            coll.add(false);
    
            //删除集合中”Tom”
            //如果还未调用next()或在上一次调用 next 方法之后已经调用了 remove 方法,
            // 再调用remove都会报IllegalStateException。
            Iterator iterator = coll.iterator();
            while(iterator.hasNext()){
    //            iterator.remove();
                Object obj = iterator.next();
                if("Tom".equals(obj)){
                    iterator.remove();
    //                iterator.remove();
                }
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    集合遍历

    //遍历集合
            iterator = coll.iterator();
            while(iterator.hasNext()){
                System.out.println(iterator.next());
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注意
    Iterator可以删除集合的元素,但是是遍历过程中通过迭代器对象的remove方法,不是集合对象的remove方法。
    如果还未调用next()或在上一次调用 next 方法之后已经调用了 remove 方法,再调用remove都会报IllegalStateException。


    总结:

    集合元素的遍历操作,使用迭代器Iterator接口

    • 1.内部的方法:hasNext()和 next()
    • 2.集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前。
    • 3.内部定义了remove(),可以在遍历的时候,删除集合中的元素。此方法不同于集合直接调用remove()

    完整代码

    public class IteratorTest {
    
        @Test
        public void test(){
            Collection coll = new ArrayList();
            coll.add(123);
            coll.add(456);
            coll.add(new Person("Jerry",20));
            coll.add(new String("Tom"));
            coll.add(false);
    
            Iterator iterator = coll.iterator();
    
            //方式一:
    //        System.out.println(iterator.next());
    //        System.out.println(iterator.next());
    //        System.out.println(iterator.next());
    //        System.out.println(iterator.next());
    //        System.out.println(iterator.next());
    //        //报异常:NoSuchElementException
    //        //因为:在调用it.next()方法之前必须要调用it.hasNext()进行检测。若不调用,且下一条记录无效,直接调用it.next()会抛出NoSuchElementException异常。
    //        System.out.println(iterator.next());
    
            //方式二:不推荐
    //        for(int i = 0;i < coll.size();i++){
    //            System.out.println(iterator.next());
    //        }
    
            //方式三:推荐
            while(iterator.hasNext()){
                System.out.println(iterator.next());
            }
        }
    
    
        @Test
        public void test2(){
            Collection coll = new ArrayList();
            coll.add(123);
            coll.add(456);
            coll.add(new Person("Jerry",20));
            coll.add(new String("Tom"));
            coll.add(false);
    
            //错误方式一:
    //        Iterator iterator = coll.iterator();
    //        while(iterator.next() != null){
    //            System.out.println(iterator.next());
    //        }
    
            //错误方式二:
            //集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前。
    //        while(coll.iterator().hasNext()){
    //            System.out.println(coll.iterator().next());
    //        }
        }
    
    
        //测试Iterator中的remove()方法
        @Test
        public void test3(){
            Collection coll = new ArrayList();
            coll.add(123);
            coll.add(456);
            coll.add(new Person("Jerry",20));
            coll.add(new String("Tom"));
            coll.add(false);
    
            //删除集合中”Tom”
            //如果还未调用next()或在上一次调用 next 方法之后已经调用了 remove 方法,
            // 再调用remove都会报IllegalStateException。
            Iterator iterator = coll.iterator();
            while(iterator.hasNext()){
    //            iterator.remove();
                Object obj = iterator.next();
                if("Tom".equals(obj)){
                    iterator.remove();
    //                iterator.remove();
                }
            }
    
            //遍历集合
            iterator = coll.iterator();
            while(iterator.hasNext()){
                System.out.println(iterator.next());
            }
    
        }
    
    
    }
    
    • 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

    使用 foreach 循环遍历集合元素

    • Java 5.0 提供了 foreach 循环迭代访问 Collection和数组。
    • 遍历操作不需获取Collection或数组的长度,无需使用索引访问元素。
    • 遍历集合的底层调用Iterator完成操作。
    • foreach还可以用来遍历数组。
      在这里插入图片描述

    for(集合元素的类型 局部变量 : 集合对象),内部仍然调用了迭代器。

        @Test
        public void test(){
            Collection coll = new ArrayList();
            coll.add(123);
            coll.add(456);
            coll.add(new Person("Jerry",20));
            coll.add(new String("Tom"));
            coll.add(false);
    
            //for(集合元素的类型 局部变量 : 集合对象),内部仍然调用了迭代器。
            for(Object obj : coll){
                System.out.println(obj);
            }
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    for(数组元素的类型 局部变量 : 数组对象)

    @Test
        public void test2(){
            int[] arr = new int[]{1,2,3,4,5,6};
            //for(数组元素的类型 局部变量 : 数组对象)
            for(int i : arr){
                System.out.println(i);
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    练习题

        //练习题
        @Test
        public void test3(){
            String[] arr = new String[]{"SS","KK","RR"};
    
    //        //方式一:普通for赋值
    //        for(int i = 0;i < arr.length;i++){
    //            arr[i] = "GG";
    //        }
    
            //方式二:增强for循环
            for(String s : arr){
                s = "GG";
            }
    
            for(int i = 0;i < arr.length;i++){
                System.out.println(arr[i]);
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    Spring IoC & DI 使⽤
    11. 搭建较通用的GoWeb开发脚手架
    core-site.xml,yarn-site.xml,hdfs-site.xml,mapred-site.xml配置
    串的基本操作(数据结构)
    .NET性能系列文章二:Newtonsoft.Json vs. System.Text.Json
    linux导入oracle备份好的数据库
    springboot+vue+elementUI大学生体质测试管理系统#毕业设计
    软件测试工程师2022年的三阶段总结
    【Overload游戏引擎细节分析】视图投影矩阵计算与摄像机
    ElasticSearch(四)【高级查询】
  • 原文地址:https://blog.csdn.net/qq_44774198/article/details/125885325