详解 迭代器 —— Iterator接口 ListIterator接口 与 并发修改异常

Posted codderyouzg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解 迭代器 —— 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

以上是关于详解 迭代器 —— Iterator接口 ListIterator接口 与 并发修改异常的主要内容,如果未能解决你的问题,请参考以下文章

Java的Iterator迭代器补充,增强for循环,泛型,List接口,set接口

用迭代器iterator遍历list中第一条数据和最后一条数据 并判断

用迭代器iterator遍历list中第一条数据和最后一条数据 并判断

Java的集合Iterator迭代器

集合 Collection List Set 迭代器 Iterator 元素排序

Collection接口都是通过Iterator()(即迭代器)来对Set和List遍历