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

  • 相关阅读:
    排序算法对比,步骤,改进,java代码实现
    OracleJDK与OpenJDK的区别和联系
    C++函数中那些不可以被声明为虚函数的函数
    编码实现环状单向链表(尾指针直接指向头指针,中间没有空节点),去除连续的重复元素的操作。
    大华2014校园招聘面试题链式存储串的连接操作
    线性表可用顺序表或链表存储的优缺点
    豆瓣面试题strstr)
    百度2014校园招聘消除嵌套的括号
    Wireshark基本介绍和学习TCP三次握手(转载)
    据说是淘宝面试题“给定一个数组将大于0的放在最右边,等于0的放在中间,大于0的放在最左边”
  • 原文地址:https://www.cnblogs.com/codderYouzg/p/12416590.html
Copyright © 2011-2022 走看看