详解 迭代器 —— 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

原文地址:https://www.cnblogs.com/codderYouzg/p/12416590.html

时间: 2024-10-08 19:51:27

详解 迭代器 —— Iterator接口、 ListIterator接口 与 并发修改异常的相关文章

设计模式之适配器模式 adapter 适配器模式分类概念角色详解 类适配器 对象适配器 接口适配器 双向适配器

现实世界中的适配器模型 先来看下来几个图片,截图自淘宝 上图为港版的插头与港版的插座 上图为插座适配器卖家的描述图 上图为适配后的结果 现实世界中适配器模式 角色分类 这就是适配器模式在电源插座上的应用 我们看下在插座适配器中的几个重要角色 可以看得出来,大陆和港版插座面板,都是作为电源的角色,他们的功能是相似的或者说相近的 插头要使用插座,进而接通电流 现实世界到代码的转换 电源插座代码示例 港版插座面板 package adapter; /**目标角色 Target 接口 * 香港地区使用的

帧中继和路由协议详解-在帧中继多点子接口上运行EIGRP

上一篇我们介绍了<帧中继和路由协议详解-在帧中继点到点子接口上运行EIGRP>,本篇我们开始介绍<在帧中继多点子接口上运行EIGRP>的配 置.相关概念,如子接口.IARP.DLCI和映射等已经在前一篇提过,本篇不再详述,有疑问的地方可以自行参考.本篇侧重配置上的问题. 背景 当有多个分部的局域网通过帧中继和总部想实现两两互联时,为了减少对总部路由器接口的占用和对应的线路费用,通常采用多个分部的同一网段用不同虚电路连接到总部局的同一局域网的方法来实现总部和分部的互联.如下图1, 三

Java API —— List接口&amp;ListIterator接口

1.List接口概述 有序的 collection(也称为序列).此接口的用户可以对列表中每个元素的插入位置进行精确地控制.用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素. 与 set 不同,列表通常允许重复的元素. 例子1: package listdemo; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * Created by gao on 15-

集合框架之——迭代器并发修改异常ConcurrentModificationException

问题: 我有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现. 使用普通迭代器出现的异常: ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常. 产生的原因: 迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常. 其实这个问题描述的是:普通迭代器遍历元素的时候,

大杂烩 -- Iterator 并发修改异常ConcurrentModificationException

基础大杂烩 -- 目录 大杂烩 -- Java中Iterator的fast-fail分析 大杂烩 -- Iterator 和 Iterable 区别和联系 问题: 在集合中,判断里面有没有"Hello"这个元素,如果有,我就添加一个"It's me"元素. 使用普通迭代器出现的异常: ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常. 产生的原因: 迭代器是依赖于集合而存在的,在判断成功后,集

Android网络请求框架AsyncHttpClient实例详解(配合JSON解析调用接口)

最近做项目要求使用到网络,想来想去选择了AsyncHttpClient框架开进行APP开发.在这里把我工作期间遇到的问题以及对AsyncHttpClient的使用经验做出相应总结,希望能对您的学习有所帮助. 首先按照惯例先来简单了解一些AsyncHttpClient网络框架的一些知识. 1.简介 Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用android-a

java.util包详解(二)——Connection接口

Connection接口介绍 Connection接口是java集合的root接口,没有实现类,只有子接口和实现子接口的各种容器.主要用来表示java集合这一大的抽象概念. Connection接口要求,所有实现此接口的容器,必须提供至少两种构造方法:无参构造方法.参数为Connection类的构造方法.后者需要创建一个具有和参数包含元素相同的新集合,以此来进行集合的复制.java中所有的api均遵守了此规则. 如果集合不支持某种修改方式,那么进行这种修改操作的方法必须抛出Unsupported

详解Java中抽象类与接口的区别

在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意.其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解.对于设计意图的理解是否正确.合理.本

详解java基础--抽象类、接口与多态

抽象类.接口.多态都是面向对象中很基础的东西,我相信看到能本篇博客的人本不会再纠结它的基本定义了,本篇文章将尽量的更加深层次的挖掘其内涵,希望能对大家有帮助. 一.抽象类 1.形式 1 abstract class Ceshi 2 { 3 abstract void show(); 4 } 5 class DemoA extends Ceshi 6 { 7 void show() 8 { 9 System.out.print("Hello world"); 10 } 11 } 2.特点