【java】-- 迭代器Iterator

1. 迭代器的指向位置

当调用 Iterator it = list.iterator()时,迭代器it的指向为Iterator1的位置。
当调用it.next()时,it的指向为Iterator2的位置。 list1就是迭代器上次访问的元素。

2.Iterator 和 ListIterator 

Iterator 中的方法:
    1)      hasNext():如果迭代器指向位置后面还有元素,则返回   true ,否则返回false
    2)     next():返回集合中Iterator指向位置后面的元素
    3)     remove():删除集合中Iterator指向位置后面的元素

ListIterator中的方法:
     1)     add(E e): 将指定的元素插入列表,插入位置为迭代器当前位置之前
    2)     hasNext():以正向遍历列表时,如果列表迭代器后面还有元素,则返回   true ,否则返回false
    3)     hasPrevious():如果以逆向遍历列表,列表迭代器前面还有元素,则返回   true ,否则返回false
    4)     next():返回列表中ListIterator指向位置后面的元素
    5)     nextIndex():返回列表中ListIterator所需位置后面元素的索引
    6)     previous():返回列表中ListIterator指向位置前面的元素
    7)     previousIndex():返回列表中ListIterator所需位置前面元素的索引
    8)     remove():从列表中删除next()或previous()返回的最后一个元素
            (对迭代器使用hasNext()方法时,删除ListIterator指向位置后面的元素;当对迭代器使用hasPrevious()方法时,删除    ListIterator        指向位置前面的元素)
            set(E e):从列表中将next()或previous()返回的最后一个元素返回的最后一个元素更改为指定元素e

3. Iterator ListIterator 的区别
    1)     ListIterator有add()方法,可以向list中添加元素,Iterator没有。
    2)     ListIterator有hasPrevious() 和 previous() 方法,可以逆向顺序向前遍历。Iterator只能向后遍历。
    3)     ListIterator有set()方法,可以修改列表,Iterator只能遍历列表,不能修改。
    4)     ListIterator是Ietreator的子接口。
    5)     ListIterator只能应用于List及其子类型,Iterator可以用于所有集合。


4.关于ConcurrentModificationException 
    1)    容器提供的迭代器都会在在迭代时进行结构性的检查。如果容器在迭代的过程中发生了结构性的变化,就会抛出 ConcurrentModificationException  ,触发fail-fast事件。所以不能在迭代中间之间调用容器类提供的add、remove方法,应该使用迭代器的add、remove的方法。
    2)    在使用for-each遍历容器时对容器进行结构性变化,也会抛出 ConcurrentModificationException。因为for-each遍历实质也是迭代器的遍历。
    3)    根据容器迭代的源码, 迭代操作中都有判断 modCount!=expectedModCount 的操作,在 ArrayList 中 modCount 是当前集合的版本号,每次修改(增、删)集合都会加 1,expectedModCount 是当前迭代器的版本号,在迭代器实例化时初始化为 modCount,所以当调用 ArrayList.add() 或 ArrayList.remove() 时只是更新了 modCount 的状态,而迭代器中的 expectedModCount 未修改,因此才会导致再次调用 Iterator.next() 方法时抛出 ConcurrentModificationException 异常。而使用 Iterator.remove() 方法没有问题是因为 Iterator 的 remove() 方法中有同步 expectedModCount 值,所以当下次再调用 next() 时检查不会抛出异常。
这其实是一种 快速失败机制(fali-fast) 机制的规则 就是当多个线程对 Collection 进行操作时若其中某一个线程通过 Iterator 遍历集合时该集合的内容被其他线程所改变,则抛出 ConcurrentModificationException 异常

注意 使用迭代器的 remove() 方法前必须先调用迭代器的 next() 方法且不允许调用一次 next() 方法后调用多次 remove() 方法。



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java中的迭代器Iterator)是一种对象,它可以遍历一个容器中的元素。迭代器模式是一种设计模式,可以将容器的遍历和实现分离。 Java中的迭代器Iterator)提供了一种方便的方法来遍历容器中的元素。它提供了三个基本操作: - hasNext(): 返回容器中是否还有下一个元素 - next(): 返回容器中的下一个元素 - remove(): 删除容器中最后一个被next()返回的元素 Java中的迭代器接口是Iterator,其中包含上述三个方法,实现类可以自定义实现这些方法以实现遍历。常见的容器类如List、Set都提供了迭代器的实现。使用迭代器可以更方便地遍历容器中的元素,并且可以在遍历过程中删除元素而不影响其他遍历操作。 ### 回答2: Java迭代器Iterator)是Java集合框架中一个非常重要的接口,用于遍历并访问集合中的元素。通过使用迭代器,我们可以避免使用传统的for循环方式遍历集合,从而使代码更加简洁、优雅和易于维护。 Java迭代器接口定义了一些常用的方法,使得我们可以在不管具体集合的实现细节的情况下,访问和处理集合中的元素。常用的方法包括: 1. hasNext(): 判断集合是否还有下一个元素。 2. next(): 返回集合中的下一个元素,并将迭代器指针向下一个元素移动。 3. remove(): 移除集合中的当前元素。 下面我们来看一个简单的例子,用来演示如何使用Java迭代器进行遍历: ``` ArrayList<String> list = new ArrayList<String>(); list.add("Java"); list.add("Python"); list.add("Ruby"); Iterator<String> it = list.iterator(); while (it.hasNext()) { String element = it.next(); System.out.println(element); } ``` 在上面的例子中,我们首先定义了一组字符串元素,并将它们添加到了一个ArrayList集合中。然后通过调用iterator()方法,得到了该集合的迭代器。接着,通过使用while循环和next()方法,逐个遍历集合中的元素,并将元素内容输出到控制台上。 需要注意的是,当调用next()方法时,如果集合中已经没有更多的元素可供遍历了,则会抛出NoSuchElementException异常。因此,在使用Java迭代器时,必须首先使用hasNext()方法来检查集合是否还有下一个元素可供遍历。 还需要注意的是,除了一些具体的集合类,如ArrayList,LinkedList, HashSet, TreeMap等,Java迭代器还可以用于自定义集合类。只要实现了Iterator接口,并在实现中定义next()、hasNext()、remove()三个方法即可。 总之,Java迭代器Java集合框架中一项非常重要的功能。通过使用迭代器,我们可以遍历和访问集合中的元素,避免了使用传统的for循环方式,从而使代码更加简洁、优雅和易于维护。 ### 回答3: Java中的迭代器Iterator)是一种用于遍历集合框架(Collection Framework)中元素的标准方式。Iterator返回的是一个迭代器对象,该对象允许程序员处理集合框架中储存的元素序列。 要使用Iterator遍历一个集合框架中的元素,需要按照以下步骤进行: 1. 调用集合框架中的iterator()方法,返回一个Iterator类型的对象; 2. 使用next()方法取出序列中的每一个元素,next()方法返回序列中的下一个元素,直到序列中的所有元素都被访问完; 3. 使用hasNext()方法判断序列中是否还有下一个元素,如果还有,则返回true,否则返回false。 另外,Iterator类型的对象只能单向遍历,即只能使用next()方法往后遍历,无法往前遍历。 Iterator除了提供基本的遍历操作外,还提供了一些额外的可选操作,例如: 1. remove()方法:从集合中移除迭代器返回的最后一个元素(如果支持的话); 2. forEachRemaining()方法:对集合中的每个元素执行指定的操作,直到所有元素都已被处理完毕或操作引发异常。 在使用Iterator时,需要注意以下几个点: 1. 迭代器只能在对应的集合框架中进行遍历操作,否则会抛出ConcurrentModificationException异常; 2. 迭代器是单向的,一旦遍历到末尾,就无法回到开头; 3. 当集合中的元素被修改、插入或删除时,遍历过程就会中断并抛出异常; 4. 迭代器虽然是fail-fast的,但这并不意味着它一定是线程安全的,如果多个线程同时访问同一个集合,就需要进行加锁、同步等操作,否则可能会出现不可预期的结果。 总的来说,Iterator是一个十分重要的概念,是Java中集合框架遍历元素的标准方式。使用Iterator可以很方便地遍历集合中的元素,并且提供了一些可选操作,但在使用时需要注意迭代器的特殊性质,以免出现异常情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值