• 【JavaEE进阶系列 | 从小白到工程师】JavaEE中的迭代器,并发修改异常与增强for循环,一文上手使用



    💨更多相关知识👇

    💖JavaEE中的面向对象特征之封装

    💖ArrayList集合中的常用成员方法

    💖Java中String的split切割字符串方法详解

    💖String中的replace的四个方法

    💖JavaEE中的Stream流的常用方法

    💖JavaEE中的Stream流知识点使用,精华总结,一文直接上手

    💖JavaWeb中的过滤器(Filter)和监听器(Listener)区别

    💖JavaEE中史上最全String类入门介绍文章,学习StringAPI这一篇即可


    🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈
     
    🍂个人博客首页: KJ.JK
     
    欢迎大家点赞👍收藏💖评论💬关注🔒
     
    💖源码获取 | 💻学习交流 | 🤝商务合作 | 💨私信作者


    一、什么是迭代器


              * JDK中提供了一个"Iterator接口",称为迭代器,可以"实现单列集合元素的遍历"
    
              * Collection接口中提供了iterator()方法,可以获取迭代器对象
    
    //只能是单列集合使用,Map里面的双列集合是不可以的      
    
    • 1
    • 2
    • 3
    • 4
    • 5

    二、迭代器的方法


            * public boolean hasNext() : 判断是否存在下一个元素
            
            * public E next() :   获取下一个元素        (next()方法"获取元素",并且"指针移动"到下一个位置)
            
            * public void remove() : 删除元素
            
    ------------------------------------------------------------------------------------------------------------
                
                
    //    迭代器使用步骤 :  (所有的单列集合都可以使用,因为迭代器是在Collection基础下的)
    
         1. 获取迭代器的对象                集合.iterator();
     
         2. 循环中,判断是否有元素可以获取     hasNext();
         
         3. 进入循环,调用next去获取元素      next();
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    🌟代码演示

            HashSet<String> set=new HashSet<>();
    
    
            set.add("张三");
            set.add("李四");
            set.add("王五");
            set.add("张三");
    
    
            //获取迭代器的对象
            Iterator<String> itr = set.iterator();
    
    
            //hasNext():判断集合是否存在下一个元素,有返回true
            while (itr.hasNext()){
    
                String name = itr.next();            //获取集合的对象
                System.out.println(name);
    
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    请添加图片描述


    三、使用迭代器常见的异常


    ⚡NoSuchElementException异常1

       HashSet<String> set=new HashSet<>();
    
    
            set.add("张三");
            set.add("李四");
            set.add("王五");
            set.add("张三");
    
    
            //获取迭代器的对象
            Iterator<String> itr = set.iterator();
    
    
            //获取集合的对象
            System.out.println(itr.next());
            System.out.println(itr.next());
            System.out.println(itr.next());
    
            System.out.println(itr.next());  
    //NoSuchElementException ,如果超过集合的长度取的话就会报没有这个数据的异常
    
    
    //解决办法: 使用hasNext()判断取元素
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    请添加图片描述


    ⚡NoSuchElementException异常2

            HashSet<String> set = new HashSet<>();
    
    
            set.add("张三");
            set.add("李四");
            set.add("王五");
            set.add("张三");
    
    
            //获取迭代器的对象
            Iterator<String> itr = set.iterator();
    
    
            //hasNext():判断集合是否存在下一个元素,有返回true
            while (itr.hasNext()) {
            
            //不要在一次循环中,多次调用next方法
            //这里代表的是一次循环获取两个数据,如果是偶数的话就没有问题,如果是奇数的话就会报异常,获取不到,不建议
                System.out.println(itr.next());
                System.out.println(itr.next());
    
         }  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    请添加图片描述


    ⚡NoSuchElementException异常3

            HashSet<String> set = new HashSet<>();
    
            set.add("张三");
            set.add("李四");
            set.add("王五");
            set.add("张三");
    
    
            //获取迭代器的对象
            Iterator<String> itr = set.iterator();
    
    
            while (itr.hasNext()) {
    
                System.out.println(itr.next());
    
            }
    
       
    
    // 使用迭代器时候,数据不能重复使用
            System.out.println(itr.next());
    
     //NoSuchElementException ,因为这个迭代器里面的数据已经用完了,
    //不能再使用这个迭代器获取数据,想使用的话要用新的迭代器
    
    -----------------------------------------------------------------------------------------------------------
        
    //解决办法 : 再次获取一个新的迭代器
        
            Iterator<String> itr2 = set.iterator();
            while (itr2.hasNext()){
                String next = itr2.next();
                System.out.println(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

    请添加图片描述


    ⚡无限循环

            Iterator<String> itr2 = set.iterator();
            while (itr2.hasNext()){
                String next = itr2.next();
                System.out.println(next);
            }
    
    
          //一直问有没有数据,不做操作会进入死循环
            while(itr2.hasNext()){
    
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    🔥系列热门专栏🔥:
     
    《JavaEE进阶序列 | 从小白到工程师》系列文章
     
    《JavaEE项目实战》系列文章
     
    《JavaSwing项目合集》系列文章
     
    《数据分析中的pandas》系列文章


    四、并发修改异常


    🍂产生原因


                当使用迭代器或者增强for循环遍历集合时,
                    
                在迭代过程中调用集合类自身的remove或者add等方法改变集合的元素个数时,
                    
                就会产生"ConcurrentModificationException",即"并发修改异常"
                    
                    "(两个对象同时在执行操作,造成冲突)"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    🌟代码演示


            ArrayList<Integer> list=new ArrayList<>();
            
            list.add(11);
            list.add(22);
            list.add(33);
            list.add(44);
            list.add(55);
    
            Iterator<Integer> it1 = list.iterator();
    
    //        迭代器在遍历集合,集合对象在删除数据,造成对数据处理的冲突
            while (it1.hasNext()){
                Integer number = it1.next();
                if(number%2==0){
                    list.remove(number);
                }
            }
    
            System.out.println(list);   //ConcurrentModificationException : 并发修改异常
                                        // 两个对象同时在执行操作,造成冲突
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    请添加图片描述


    🍂解决办法


         1.使用普通for循环遍历元素,在循环中"使用集合自带的add或remove方法增删元素即可"
             
         2.如果使用迭代器遍历集合,在迭代过程中如果需要删除元素,可以"使用迭代器自带的remove方法"
    
    • 1
    • 2
    • 3

    🌟代码演示


         ArrayList<Integer> list=new ArrayList<>();
            
            list.add(11);
            list.add(22);
            list.add(33);
            list.add(44);
            list.add(55);
    
            Iterator<Integer> it1 = list.iterator();
    
            //解决办法:统一成一个对象就行
            while (it1.hasNext()){
                Integer number = it1.next();
                if(number%2==0){
                   it1.remove();
                }
            }
    
    
    
            //也可以集合自己遍历删
            for (int i = 0; i < list.size(); i++) {
                Integer number = list.get(i);
                if(number%2==0){
                    list.remove(number);
                    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

    请添加图片描述


    五、什么是增强for循环?


             * 它是JDK5之后出现的,其内部原理是一个"Iterator迭代器"
           
             * "数组""Collection集合"都可以使用增强for循环
             
    //作用: 简化迭代器遍历的语法
    
    • 1
    • 2
    • 3
    • 4
    • 5

    六、增强for循环的语法格式


              格式:
                      for(元素数据类型 变量名 : "数组" 或者 "Collection集合") {
                             //在此处使用变量即可,该变量就是代表每一个元素
                           }
    
              范例1:  HashSet<String> set=new HashSet<>();
    
                    set.add("张三");
                    set.add("李四");
                    set.add("王五");
                    set.add("赵六");
    
    
            //使用增强for循环变量(简化迭代器)
            /*
                   for (元素类型 变量名 : 集合或数组){
                          }
             */
    
                         for(String s : set){
                                   //s 就代表set集合中的每一个元素
                          System.out.println(s);
                        }
    ------------------------------------------------------------------------------------------------------------
        
        
              范例2:    int [] arr= {11,22,33};
    
    
                      for (int i : arr) {
                        System.out.println(i);
                       }
     
    // 增强for快捷键,集合或数组.for
    
    • 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

    🌟代码演示

    请添加图片描述


    七、增强for循环的注意事项


                  * 增强for循环底层是"迭代器",所以"不要在遍历过程中增删元素", 否则会有并发修改异常
           
                 * 增强for循环操作的是"数组""集合"
                     
                 * 需要遍历的集合或数组"不能为null"  
    
    • 1
    • 2
    • 3
    • 4
    • 5

    作者:KJ.JK

    文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习

  • 相关阅读:
    异步电机直接转矩控制学习
    DevExpress WPF中文教程:Grid - 如何排序、分组、过滤数据(设计时)?
    js中replace函数的使用
    curl: (56) Recv failure: Connection reset by peer
    蜂窝物联网咖WiFi认证解决方案
    Java 大神面试经验
    JAVA集合框架(一)-ARRAYLIST
    03. 人工智能核心基础 - 导论(2)
    论文阅读之Learning and Generalization of Motor Skills by Learning from Demonstration
    Playwright官方文档要点记录(java)
  • 原文地址:https://blog.csdn.net/m0_47384542/article/details/125957435