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方法,在迭代过程中它就可以调用这个方法,不会发生异常。

  • 相关阅读:
    C#项目中怎样创建和使用类和类库
    第一个存储过程程序
    C# 如何判断字符串中是否包含另一个字符串?
    word中怎么快速选中光标之前或之后的全部内容?
    DHL学习--<asp:literal
    ASP.NET后台怎么输出方法中间调试信息?
    联想THINKPAD E40的快捷键怎么关闭?哪些F1 F2 F3的键我需要用到 但是每次都按FN 太烦人了
    sql 参数化查询问题
    echarts地图 禁止高亮显示(转载)
    EChart中使用地图方式总结(转载)
  • 原文地址:https://www.cnblogs.com/wangqilong/p/9417568.html
Copyright © 2011-2022 走看看