资讯专栏INFORMATION COLUMN

java迭代器

苏丹 / 611人阅读

摘要:迭代器接口定义通过反复调用方法可以逐个访问集合中的每个元素。的迭代器是指向两个元素中间的位置。好在链表迭代器可以检测这种状况。现在向如下方式插入通过得到迭代器后的状态如下图后此时,迭代器在和之间。调用之后将插入到迭代器的前面,的后面。

java迭代器 Iterator 接口定义
public interface Iterator { 
    E next(); 
    boolean hasNext();
    void remove(); 
    default void forEachRemaining(Consumer action); 
    }

通过反复调用 next 方法,可以逐个访问集合中的每个元素。但是,如果到达了集合的末尾,next 方法将抛出一个 NoSuchElementException。可以通过调用hasNext方法判断是否到达了末尾。java的迭代器是指向两个元素中间的位置。调用next会将迭代器从上一个元素中间的位置移动到下一个元素中间的位置,期间返回跨过的元素。remove跟next是有依赖关系的,remove删除的是next跨过的元素,如果在调用remove之前没有调用next将会得到一个IllegalStateException异常。例如,下面从一个集合中删除一个元素

Iterator it = integerList.iterator();
it.next();
it.remove(); //会删掉第一个元素
it.remove(); //抛出IllegalStateException异常

第一次remove删除第一个元素,但是第二个remove会抛出IllegalStateException异常。因为调用第二次remove之前没有调用next,next没有跨过某个元素。

it.remove(); //会删掉第一个元素
it.next();
it.remove(); //正确

在两个remove之间再调用一次next,第二次remove就正确了。

冲突检测

想象一下,现有链表:1,2,3,4。同时存在两个迭代器it1,it2,都指向1和2之间,如果按下面这段代码这样操作:

it1.next();
it1.remove();
it2.next()

it1已经将2删除,而it2需要返回2,这就出现了混乱状况。好在链表迭代器可以检测这种状况。如果向上述代码一样一个迭代器访问,一个迭代器修改或是被自身的某个方法修改了,就会抛出一个ConcurrentModificationException异常。

ListIterator add方法

Listlterator 接口是 Iterator 的一个子接口。它定义了一个方法用于在迭代器位置前面增加一个元素:
void add(E element)
刚才前面说了,迭代器指向的是两个元素中间的位置。假设现在有个序列:1,2,3。现在向如下方式插入:

ListIterator it = intArray.listIterator();
it.add(3);
it.add(4);

通过intArray.listIterator()得到迭代器后的状态如下图:
8511c18bc8182c6a79eb51f1e4eee3f3.png
it.add(3) 后:
de3d29aa7283fd924c29d34df9c66499.png
此时,迭代器在3和1之间。调用 it.add(4) 之后:
1a1b74acddae126df927cc2b20e3917a.png
将4插入到迭代器的前面,3的后面。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77858.html

相关文章

  • fail-fast与fail-safe在Java集合中的应用

    摘要:与在迭代器中的设计在中,最典型的与就是关于迭代器的设计。缺点是,迭代器不能正确及时的反应集合中的内容,而且一定程度上也增加了内存的消耗。 fail-fast与fail-safe简介 如果一个系统,当有异常或者错误发生时就立即中断执行,这种设计称之为fail-fast。相反如果我们的系统可以在某种异常或者错误发生时继续执行,不会被中断,这种设计称之为fail-safe。 fail-fas...

    Drummor 评论0 收藏0
  • java的集合和泛型的知识点归纳1

    摘要:接口也是集合中的一员,但它与接口有所不同,接口与接口主要用于存储元素,而主要用于迭代访问即遍历中的元素,因此对象也被称为迭代器。迭代器的实现原理我们在之前案例已经完成了遍历集合的整个过程。 【Collection、泛型】 主要内容 Collection集合 迭代器 增强for 泛型 教学目标 [ ] 能够说出集合与数组的区别 [ ] 说出Collection集合的常用功能 [ ]...

    daryl 评论0 收藏0
  • Java集合框架——List接口

    摘要:第三阶段常见对象的学习集合框架接口按照集合框架的继承体系,我们先从中的接口开始学习一概述及功能演示概述在中充当着一个什么样的身份呢有序的也称为序列实现这个接口的用户以对列表中每个元素的插入位置进行精确地控制。线程不安全,效率高。 第三阶段 JAVA常见对象的学习 集合框架——List接口 showImg(https://segmentfault.com/img/remote/14600...

    褰辩话 评论0 收藏0
  • 一篇文章看懂java迭代

    摘要:具体原因在后面说明是必须实现的接口,返回了一个迭代器。迭代器,可以对已知集合进行遍历操作。这里可以看出,循环最终其实是会使用方法获取迭代器,来完成遍历。 概述 迭代器,提供了在不了解集合内部实现方法的时候遍历集合的能力。可以将容器内部实现与遍历操作隔离、解耦。 使用迭代器实现一个简单集合 通过自定义一个简单集合,并在对其使用迭代器进行遍历,达到掌握迭代器的目的。 集合描述 一个简单的集...

    kyanag 评论0 收藏0
  • 集合概要学习---粗略

    摘要:集合框架的基本接口类层次结构其中表示接口,表示实现类和在实际开发中,需要将使用的对象存储于特定数据结构的容器中。实例是迭代器,拥有两个方法方法迭代器用于遍历集合元素。返回值则是转换后的数组,该数组会保存集合中的所有元素。 Java Collections Framework是Java提供的对集合进行定义,操作,和管理的包含一组接口,类的体系结构。 Java集合框架的基本接口/类层次结构...

    DesGemini 评论0 收藏0
  • Java 迭代引发 ConcurrentModificationException

    摘要:迭代器智能吗第一步,将列表中的根节点找出来。源码翻开中迭代器的源码。在迭代器对象执行操作之前,都会执行方法,以判断当前操作下是否安全。 引言 ConcurrentModificationException这个异常大家都很熟悉,当在forEach进行删除时都会出现该异常。 如果你还不了解,请参考澍澍的博客:关于在list循环的过程中进行删除的处理 - 晨澍的博客 showImg(http...

    用户83 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<