详解 迭代器 —— 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://blog.csdn.net/weixin_45238600/article/details/104141546
(集合总集篇链接:https://blog.csdn.net/weixin_45238600/article/details/103975226

那么,本篇博文的主要内容就讲解完了,若是对上述知识点或代码有任何疑惑、意见或者建议,请在下方评论区提出,本人将尽早予以答复,觉得有所帮助的同学请留下小赞赞,谢谢!!!

发布了118 篇原创文章 · 获赞 82 · 访问量 5219

猜你喜欢

转载自blog.csdn.net/weixin_45238600/article/details/104139890