zoukankan      html  css  js  c++  java
  • 详解 迭代器 —— Iterator接口、 ListIterator接口 与 并发修改异常

    (请关注 本人“Collection集合”博文——《详解 Collection集合》

    Iterator接口(迭代器):

    概述:
    collection 进行迭代的迭代器

    在我们现阶段的学习中,只需要理解这个接口所提供的三个方法即可:

    • boolean hasNext()
      如果仍有元素可以迭代,则返回 true。
    • E next()
      返回迭代的下一个元素。
    • void remove()
      从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。

    现在,本人来通过一段代码来展示下迭代器的使用方法:

    package com.youzg.about_iterator.core;
    
    import java.util.*;
    
    public class Test {
        
        public static void main(String[] args) {
            Collection arrayList = new ArrayList();	//由于ArrayList是Collection的实现类,所以我们可以这样去实例化一个Collection子类的对象
            arrayList.add(1000);
            arrayList.add(2000);
            arrayList.add(3000);
            arrayList.add(4000);
            arrayList.add(5000);
            arrayList.add(6000);
    
    
            Iterator iterator = arrayList.iterator();		//我们必须通过这个方法得到迭代器,才能在之后通过迭代器遍历集合
            System.out.println(iterator);
    
            while (iterator.hasNext()) { 		//判断是否还有下一个元素
                Object next = iterator.next();  //把指针狭义
                System.out.println(next); 		//获取下一个元素
            }
        }
    }
    

    现在,本人来展示下运行结果:
    在这里插入图片描述

    下图是它的实现类和子接口:
    在这里插入图片描述
    Collection类有List类。
    相应地,Iterator类也有ListIterator子类,
    因为我们未来的编程对于List这个接口的使用比较频繁,所以,在这里,本人再来讲解一下有关ListIterator的知识点:

    ListIterator接口:

    • void add(E e)
      将指定的元素插入列表(可选操作)。
    • boolean hasNext()
      以正向遍历列表时,如果列表迭代器有多个元素,则返回 true(换句话说,如果 next 返回一个元素而不是抛出异常,则返回 true)。
    • boolean hasPrevious()
      如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。 E next()
      返回列表中的下一个元素。
    • int nextIndex()
      返回对 next 的后续调用所返回元素的索引。
    • E previous()
      返回列表中的前一个元素。
    • int previousIndex()
      返回对 previous 的后续调用所返回元素的索引。
    • void remove()
      从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)。
    • void set(E e)
      用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。

    因为比 Iterator接口 多了一些方法,所以,我们可以对于一个List进行反向遍历
    那么,现在,本人通过一段代码来展示下:

    package edu.youzg.about_collection.core;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.ListIterator;
    
    public class Test {
    
        public static void main(String[] args) {
            List arrayList = new ArrayList();
    
            arrayList.add(1001);
            arrayList.add(1002);
            arrayList.add(1003);
            arrayList.add(1004);
    
            //正向迭代
            ListIterator listIterator = arrayList.listIterator();
            while (listIterator.hasNext()){
                Object next = listIterator.next();
                System.out.println(next);
            }
            
            System.out.println("===================");
            
            //反向迭代:注意进行反向迭代器前,先进行正向迭代
            // ListIterator listIterator2 = arrayList.listIterator();
            while (listIterator.hasPrevious()){ //判断有没有上一个元素
                Object previous = listIterator.previous(); //获取上一个元素
                System.out.println(previous);
            }
    
        }
        
    }
    

    现在,本人来展示下运行结果:
    在这里插入图片描述
    讲到这里,相信同学们也差不多学会了该如何使用迭代器来遍历集合了,那么,现在本人来讲解一个非常常见的“异常”—— ConcurrentModificationException

    ConcurrentModificationException异常:

    定义

    定义
    并发修改异常

    出现原因

    出现原因
    我们的迭代依赖于集合, 当我们往集合中添加好了元素之后 获取迭代器 那么迭代器已经知道了集合的元素个数
    这个时候你在遍历的时候又突然想给 集合里面增、删、改元素(用的是集合的add方法),就会与已生成的迭代器对于数量的记录产生冲突,就会报异常

    解决方法

    解决方法
    ListIterator迭代器遍历 用迭代器自带的add、remove、set方法添加元素 那就不会报错了

    (Collection链接:https:////www.cnblogs.com/codderYouzg/p/12416566.html
    (集合总集篇链接:https://www.cnblogs.com/codderYouzg/p/12416560.html

  • 相关阅读:
    django添加检查用户名和手机号数量接口
    1.vue发送短信逻辑
    Celery 配置与基本使用 并且用celery 一步发送短信
    递归基础_并查集思想_二叉树最大深度问题
    递归基础_汉诺塔问题_经典的多状态问题_整体法/分两个函数互相递归
    递归基础_全排列+改写_组合数
    递归基础_组合数_输出的各种办法(递归)_(持续更新)
    关于gpu版本的tensorflow+anaconda的一些安装问题(持续更新)
    吴恩达课程笔记_1-1~1-4
    bfs和dfs辨析—基础复习(从stack和queue的角度来理解区别,加深理解,不再模糊)
  • 原文地址:https://www.cnblogs.com/codderYouzg/p/12416590.html
Copyright © 2011-2022 走看看