zoukankan      html  css  js  c++  java
  • List集合ListIterator和Iterator迭代器区别与用法

    ListIterator是Iterator的子接口,是List集合特有的迭代输出接口,它可以实现在迭代过程中对元素的增删改查。


    在使用Iterator迭代过程中,不要使用集合操作元素,容易出现异常,demo1:

    package com.wql;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.ListIterator;
    
    /**
     * Iterator接口演示
     * 
     * @author wql
     *
     */
    public class ListIteratorDemo {
    
        public static void main(String[] args) {
            // TODO 自动生成的方法存根
            ArrayList list = new ArrayList();
            list.add("abc1");
            list.add("abc2");
            list.add("abc3");
            System.out.println(list);
    
            Iterator it = list.iterator();//Iterator 接口
    
            /**
             * 找到元素"abc2",在后面添加一个"abc5"
             */
            while (it.hasNext()) {
                Object obj = it.next();
                if (obj.equals("abc2")) {
                    list.add("abc5");// Iterator没有增添元素的方法,只能去操作集合,所以发生异常
                }
            }
            System.out.println(list);
    
        }
    
    }
    

    运行出现异常:
    这里写图片描述
    集合在迭代过程中不允许对集合修改操作,因而发生异常。


    在List集合有一个独特的迭代器ListIterator,它有自己的对集合操作修改的方法,可以在集合进行迭代过程中允许操作修改,demo2:

    package com.wql;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.ListIterator;
    
    /**
     * ListIterator接口演示
     * 
     * @author wql
     *
     */
    public class ListIteratorDemo {
    
        public static void main(String[] args) {
            // TODO 自动生成的方法存根
            ArrayList list = new ArrayList();
            list.add("abc1");
            list.add("abc2");
            list.add("abc3");
            System.out.println(list);
    
            ListIterator it = list.listIterator();//ListIterator 接口
    
            /**
             * 找到元素"abc2",在后面添加一个"abc5"
             */
            while (it.hasNext()) {
                Object obj = it.next();
                if (obj.equals("abc2")) {
                    it.add("abc5");// 调用Iterator自己的remove方法,不用去操作集合,所以不会发生异常
                }
            }
            System.out.println(list);
    
        }
    
    }

    运行正常:
    这里写图片描述

    Iterator有它自己的对集合操作修改的方法,因而在迭代过程不会调用集合的方法,不会有异常


    使用Iterator迭代过程中,调用其自身方法remove,demo3:

    package com.wql;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.ListIterator;
    
    /**
     * ListIterator接口演示
     * 
     * @author wql
     *
     */
    public class ListIteratorDemo {
    
        public static void main(String[] args) {
            // TODO 自动生成的方法存根
            ArrayList list = new ArrayList();
            list.add("abc1");
            list.add("abc2");
            list.add("abc3");
            System.out.println(list);
            Iterator it = list.iterator();
            //ListIterator it = list.listIterator();
    
            /**
             * 调用Iterator自己的remove方法,删除元素"abc2"
             */
    
            while (it.hasNext()) {
                Object obj = it.next();
                if(obj.equals("abc2")) {
                    it.remove();// 调用Iterator自己的remove方法,不用去操作集合,所以不会发生异常 } }
                }
            }   
            System.out.println(list);
    
        }
    
    }

    运行正常
    这里写图片描述


    总结:
    迭代器ListIterator之所以可以在集合迭代过程中增删改查,是因为它具有这些方法
    这里写图片描述

    而迭代器Iterator在集合迭代过程中对集合操作会发生异常是因为它本身没有这些方法,如果它想去操作集合,就得去调用集合的方法,而不是它自身的方法,因而发生异常
    这里写图片描述

    这个方法表看,Iterator有自己的remove方法,在迭代过程中它就可以调用这个方法,不会发生异常。

  • 相关阅读:
    Druid 使用 Kafka 将数据载入到 Kafka
    Druid 使用 Kafka 数据加载教程——下载和启动 Kafka
    Druid 集群方式部署 —— 启动服务
    Druid 集群方式部署 —— 端口调整
    Druid 集群方式部署 —— 配置调整
    Druid 集群方式部署 —— 配置 Zookeeper 连接
    Druid 集群方式部署 —— 元数据和深度存储
    Druid 集群方式部署 —— 从独立服务器部署上合并到集群的硬件配置
    Druid 集群方式部署 —— 选择硬件
    Druid 独立服务器方式部署文档
  • 原文地址:https://www.cnblogs.com/wangqilong/p/9417568.html
Copyright © 2011-2022 走看看