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

  • 相关阅读:
    安装一个Linux 罗晓杜
    基本正则表达 罗晓杜
    安装MySQL 罗晓杜
    复选框返回选中项ID到后台
    软件工程的理解
    作业一:计科131邵楠
    javascript中函数和方法的区别
    Javascript动画系列之 —— lightbox实现(一)
    如何让自己的javascript代码具有可维护性?
    javascript动画系列 —— 切换图片(原生)
  • 原文地址:https://www.cnblogs.com/wangqilong/p/9417568.html
Copyright © 2020-2023  润新知